리눅스 명령어 snippets
2019, Oct 20
목차
-
head : 앞쪽 보여주기
-
tail : 뒷쪽 보여주기
-
wc : 몇 줄이 적힌지 보기
-
nl : 줄 번호 보기
-
sort : 정렬
-
uniq : 중복 삭제
-
cut : 텍스트 자르기
-
tr : 텍스트 찾아 바꾸기
-
sed : 줄단위 작업
-
awk : 스크립팅
-
find : 파일 찾기
-
grep : 텍스트 검색
-
apropos : man page 검색
-
locate : 파일 위치 검색
-
which : 실행 파일 위치 검색
-
SSH: 다른 컴퓨터를 리모트로 조작
-
sudo: 임시로 관리자 권한을 얻을 때
-
grep: 다양한 문자열을 한 번에 검색
-
vim: 터미널에서 편집기 사용
-
yank: vim에서 복사, 붙여넣기, 되돌리기 사용
-
가상 터미널: 갑작스러운 네트워크 끊김에서 복귀
-
화면 분할: 다른 화면도 보면서 작업이 필요할 때
-
명령어 이력: 최근 실행한 명령어 호출
-
명령어 이력 검색: 오래전에 실행한 명령어 호출
-
scp: 네트워크를 건너서 파일을 복사
-
top: 시스템 과부하 파악
-
top 표시 전환: 시스템 메모리 부족 파악
-
파이프라인: 로그 파일에서 필요한 줄만 추출
-
쉘 스크립트: 작업 절차 자동화
-
쉘 변수: 같은 문자열을 스크립트에서 재사용
-
환경 변수: 작업 환경과 상태를 정해서 스크립트 실행
-
cut: 로그 파일에서 필요한 줄만 추출
-
sort, uniq: 같은 내용의 줄을 카운트
-
sort와 리다이렉트: csv 파일을 열의 내용에 따라 정렬
-
명령줄 인수: 명령줄 지정으로 작업 내용을 바꾸기
-
조건 분기: 조건에 따라 처리 흐름 바꾸기
-
종료 상태: 명령어 이상 종료에 대응
-
for: 같은 처리를 반복
-
쉘 함수: 공통 처리를 재사용
-
crontab: 정기적인 작업을 자동으로 처리
-
공개키 인증: 키 인증으로 안전하게 로그인 처리
-
tree : 파일 계층 출력
-
ls : 파일 및 폴더 목록 출력
-
df, du : 디스크 및 하위 디렉토리 용량 확인
-
tar : 리눅스 파일 압축 및 해제
-
리눅스 명령어의 응용
-
Could not get lock /var/lib/dpkg/lock - open 오류 수정
-
텍스트파일 내의 행의 갯수를 알고 싶은 경우
-
리눅스 특정 폴더 이하 파일 개수 세기
-
텍스트 파일 행 단위 정렬
-
하부 디렉토리 구조 복사하기
-
하부 디렉토리 구조 출력
-
zip, unzip을 이용한 분할 압축 및 해제
SSH: 다른 컴퓨터를 리모트로 조작
- 먼저 SSH란 용어부터 살펴보면
Secure Shell
의 약자입니다. - 이 뜻은 다른 PC에 네트워크 경유로 로그인해서 자기 앞에 있는 PC처럼 조작할 수 있다는 뜻입니다.
- 통신 경로는 SSH Tunnel인데 암호화 되어서 안전하고 인터넷 경유라도 IP 주소만 알면 리모트 조작이 가능합니다.
- 사용 방법은
ssh 사용자명 @IP주소
로 사용하면 됩니다.- e.g.
ssh user@192.168.11.5
- e.g.
- 단순히
ssh
를 사용하여 원격 접속한 경우에는 커맨드라인 환경에서 작업을 해야 하는데 그래픽 환경에서 하고 싶으면X
를 이용해야 합니다. X
는 리눅스에서 화면 표시와 입력을 담당하는 구조입니다. 즉, 다양한 어플리케이션에서 받는 입력과 또 그러한 어플리케이션을 그래픽으로 표현하기 위해서는X
를 거쳐야 하고 그역할을X
가 하고 있습니다.- 만약 원격 PC를 내 컴퓨터에서 그래픽 환경으로 구성하고 싶으면 원격 PC의
X
를 사용하지 말고 내 컴퓨터(클라이언트)의X
를 이용하고 그 결과를 내 컴퓨터에 출력하도록 하면 됩니다. - 이렇게 사용하려고 할 때 쓰는 방법이 명령어에
-Y
와-C
를 붙이는 방법입니다. 예를 들어 ``ssh -Y -C user@192.168.11.5`라고 사용할 수 있습니다.-Y
는 X 전송 지정을 나타내고-C
는 통신 내용을 압축 하겠다는 뜻입니다. 이렇게 하면 응답 속도가 좋아집니다.
- 이렇게 접속한 다음에
nautilus
라는 명령어를 치면 그래픽 환경이 접근 됩니다.
sudo: 임시로 관리자 권한을 얻을 때
- 리눅스의 파일에는 3가지 권한이 있습니다. read/write/execute
- 이 3가지 접근 권한은 파일 소유자에 의해서 수정될 수 있는데 예외적으로
root
에 의하여 수정될 수 있습니다. - root는 관리자 권한을 가진 특별한 사용자인데 파일 접근 권한을 자유롭게 변경하거나 다른 사람 파일을 수정할 수 있습니다.
- 우분투에서는 root로 로그인 하는것이 제한되어 있는데 대신에 일반 사용자가 root와 같은 권한을 임시적으로 얻을 수 있도록 할 수 있습니다.
- 즉, 임시적으로 root와 같은 특권을 사용하려면 그 때마다 암호를 입력하면 됩니다.
- 이렇게 임시적으로 root의 권한을 암호를 통하여 얻고 싶을 때 사용하는 키워드가
sudo
입니다. - 만약 그래픽 환경에서 작업을 하고 싶으면 다음과 같이 명령어를 입력해서 새로 뜬 그래픽 창에서는 관리자 권한이 주어집니다.
gksudo --sync nautilus
- 만약 우분투에서 root로 로그인을 하고 싶으면 다음과 같이 명령어를 입력해서 실행할 수 있습니다. 하지만 root로 로그인 하면 자칫 실수로 변경하면 안되는 것을 변경할 수 있으니 주의하셔야 합니다.
sudo -i
또는sudo su
grep: 다양한 문자열을 한 번에 검색
grep
은global regular expression print
의 약자로 파일 내용을 빠짐없이 확인해서 찾는 문자열이 포함되어 있는지 확인해 줍니다.- 사용방법은
grep -r "검색하고 싶은 문자열" 경로
형태로 보통 사용합니다.- 여기서 옵션
-r
은 서브 폴더까지 검색하도록 지정하는 옵션입니다. 즉, 경로를 시작점으로 하여 그 아래에 있는 서브 폴더 까지 모두 검색하는 것입니다. - e.g.
grep -r "my name" /home/docs/
이라고 하면 /home/docs 에서 부터 모든 문서에서 “my name” 이라는 문자열이 들어간 모든 문서를 찾는다는 뜻입니다.
- 여기서 옵션
- 만약 검색할 때 대소문자를 무시하고 검색하고 싶으면
-i
옵션을 사용합니다.- e.g.
grep -ri "my name" /home/docs/
- e.g.
- 만약 찾은 문서의 몇번 째 줄에 있는지 알고 싶으면
-n
옵션을 사용합니다.- e.g.
grep -rin "my name" /home/docs/
- e.g.
grep
은 이름 그대로regular expression
을 사용하므로 정규식을 사용할 수 있습니다.- 정규식은 특수한 기호를 써서 검색하고 싶은 내용을 유연하게 표현하는 서식입니다. (정규표현식 관련 내용)
- ( ) : 그룹화
-
: 좌우 중 하나 - ? : 직전 표현이 0회 또는 1회 등장
-
- : 직전 표현이 0회 이상 연속하여 등장
-
- : 직전 표현이 1회 이상 연속하여 등장
- . : 임의의 한 문자
- ^ : 줄 머리
- $ : 줄 끝
- 예를 들어 제 이름으로 한번 검색해 보도록 하겠습니다. (KIM JINSOL, 김진솔)
- 만약에 한영이 섞여 있을 수 있다고 가정해 보면 (KIM JINSOL, KIM 진솔, 김 JINSOL, 김진솔) 이렇게 있을 수 있습니다.
- 이런 경우에
(김 | KIM)
과(진솔 | JINSOL)
이란 정규식을 쓰면 한글 영어의 성과 이름을 그룹화 할 수 있습니다. - 만약 성과 이름 사이에 스페이스가 있을 수도 있고 없을 수도 있습니다. 이럴 때에는 이렇게 사용하면 됩니다.
(김 | KIM) ?(진솔 | JINSOL)
또는(김 | KIM) *(진솔 | JINSOL)
이렇게 하면?
와*
앞에 스페이스가 있기 때문에 스페이스가 0회 또는 1회, 0회 이상 등장하는 경우도 처리할 수 있습니다.- 그러면 실제로 이런 정규 표현식을
grep
에서 어떻게 쓰는지 살펴보겠습니다. 정규식을 사용할 때에는 옵션으로-E
를 주어야 합니다.- e.g.
grep -rinE "(김 | KIM) *(진솔 | JINSOL)" /home/docs
- e.g.
쉘 스크립트: 작업 절차 자동화
- 쉘 스크립트는 쉘 작업을 자동화 하도록 만든 문서를 말합니다. 단순한 텍스트 파일로 내부는 명령어 실행 절차가 적혀져 있습니다.
- 쉘 스크립트를 사용해서 명령어를 직접 순서대로 실행하는 대신에 쉘이 실행하도록 맡기면 됩니다.
- 비교하자면 파이프라인은 명령어 출력을 다음 명령어로 입력하여 옆으로 연결하는 것이라면 쉘 스크립트는 명령어를 세로로 연결하는 것이라고 보면 됩니다.
- 쉘 스크립트를 만들기 위해서 문서를 편집해야 하는데, 간편한
vim
을 써서 쉘 스크립트를 한번 만들어 보겠습니다. - 다루어 볼 예제는 컴퓨터 셋업 이라고 하겠습니다. 그러면
vim setup.sh
명령어를 실행하겠습니다.
- 쉘 스크립트에 가장 먼저 지정해 주어야 하는 것이
shebang
또는hash-bang
이라고 하는 것입니다.- 이것은 스크립트를 실행할 프로그램을 지정하는 것인데요
- 대표적으로 bash, zsh, python, ruby 등등이 있습니다.
- 이번에 쉘 스크립트를 간략하게 배우기 위해서 사용할 프로그램은
bash
입니다.- 그러면 작성할 쉘 스크립트는
bash
가 실행하겠다는 의미입니다.
- 그러면 작성할 쉘 스크립트는
- 그러면 첫 줄에
#! /bin/bash
라고 입력하겠습니다. - 그 다음 줄부터는
bash
가 실행할 리눅스 명령어 들을 다음과 같이 입력해 보겠습니다.
- 위 쉘 스크립트를 보면 프로그래밍 지식이 없어도 사용할 수 있는 명령어들 입니다. 그만큼 간단합니다.
- 첫 줄에는
shebang
이 있고 그 다음줄 부터는 리눅스 명령어 들이 나열되어 있습니다. - 위와 같이 입력이 끝났으면
vim
을 종료해 보겠습니다.
- 그 다음으로 setup.sh 파일을 실행하려면 실행 권한을 주어야 합니다. 따라서
chmod +x setup.sh
로 실행 권한을 부여합니다. - 실행을 할때에는 경로에 맞춰서 setup.sh 파일을 실행하고 만약 현재 경로에 있다면
./setup.sh
로 실행합니다. - 그러면 스크립트에 있는 명령어 들이 차례대로 실행됩니다.
#! /bin/bash
echo "hello"
this line is error
echo "hello2"
- 만약 위와 같은 쉘 스크립트(test.sh)를 입력하면 중간에
this line is error
라는 줄에 의해 에러가 발생합니다. - 이 때 출력은 다음과 같습니다.
hello
./test.sh: line 5: this: command not found
hello2
- 만약 에러가 나도 계속 실행하는 것이 의도적이라면 위와 같이 입력해 놓으면 됩니다.
- 만약 에러가 나면 명령을 멈추게 하려면 이렇게 명령어를 작성하면 됩니다.
#! /bin/bash
echo "hello"
this line is error
if [ $? != 0 ]; then exit; fi
echo "hello2"
- 중간에
if [ $? != 0 ]; then exit; fi
라는 명령어를 추가해 놓으면 에러가 난 곳에서 스크립트가 멈춥니다.if [ $? != 0 ]; then exit; fi
에서 대괄호 사이에는 반드시 스페이스를 입력해 주어야 합니다.
- 그러면 위 코드에서 hello2를 출력하기 전에 스크립트가 멈추게 됩니다.
if [ $? != 0 ]; then exit; fi
의 의미를 살펴보면#?
가 뜻하는 것은 마지막으로 실행된 명령어의 상태를 뜻합니다.- 상태는 다음과 같이 있고 0인 경우에는 정상 적으로 실행되었다는 뜻입니다. 즉 0이 아니면 오류가 발생하였다는 것이지요.
- Exit code 0 Success
- Exit code 1 General errors, Miscellaneous errors, such as “divide by zero” and other impermissible operations
- Exit code 2 Misuse of shell builtins (according to Bash documentation) Example: empty_function() {}
- 정리하면 다음과 같습니다.
- bash용 쉘 스크립트를 작성하려면 텍스트 파일 첫 줄에
#! /bin/bash
라고 적고 두번째 줄 이후는 자동 실행하고 싶은 쉘 명령어를 작성합니다. - 쉘 스크립트는
chmod +x
파일명으로 실행 권한을 설정합니다. - 명령어가 이상이 생겨서 그 시점에서 스크립트 실행을 중단하고 싶을 때,
if [ $? != 0 ]; then exit; fi
라고 적습니다.
쉘 변수: 같은 문자열을 스크립트에서 재사용
- vim에서 문서를 작성할 때, 같은 명령어에서 오류가 계속 발생한 상황이라면 한번에 모든 것을 고치는 것이 간편합니다.
esc
를 이용하여 노멀 모드로 돌아간 다음에:%s/원문/수정문
을 이용하면 다양한 편집기에서 모두 변환하기를 사용할 수 있듯이 똑같이 한번에 변환 됩니다.- 만약 어떤 명령어를 계속 사용해야 하면 변수로 지정을 해버릴 수도 있습니다.
- 예를 들어
var/log/access.log
라는 것이 계속 사용되어야 한다면log=var/log/access.log
로 변수를 지정해 버릴 수 있습니다. - 이렇게 변수를 선언하면 vim 또는 GNOME에서 사용 가능해집니다. 사용할 때에는 변수 앞에
$
를 붙이면 됩니다. 따라서$log
라고 사용하면 그것은 var/log/access.log로 치환됩니다. - 변수 선언의 장점은 매번 동일한 명령어를 사용하지 않아도 되는 것에 있으며 이렇게 되면 실수를 하지 않을 수 있습니다.
- 예를 들어
tar xfv 파일경로
는 파일 압축 풀기이고tar cfv 파일경로
는 파일 압축을 하는 것입니다. - 이 때,
tar_extract="tar xfv"
라고 하고tar_compress="tar cfv"
라고 변수 선언을 하면 헷갈리지 않고 사용할 수 있습니다. - 이후에는
$tar_extract
또는$tar_compress
와 같이 사용하면 됩니다.
- 예를 들어
환경 변수: 작업 환경과 상태를 정해서 스크립트 실행
tree : 파일 계층 출력
tree
명령어를 이용하면 디스크 전체 및 특정 경로에서의 파일 및 폴더 구조를 tree 형태로 볼 수 있습니다.tree -L depth
명령어를 이용하면depth
의 깊이 까지만 확인 할 수 있어서 데이터가 많을 때 간략하게 볼 수 있습니다.- 예를 들어
tree -L 2
라고 하면 $PWD 기준으로 하위 2레벨 까지의 구조만 tree 형태로 보여줍니다.
-
ls : 파일 및 폴더 목록 출력
ls
명령어를 이용하면 특정 경로의 파일 및 폴더의 목록을 출력할 수 있습니다. 기본 출력 방식은 파일 및 폴더의 이름 오름차순입니다. 특히 여러가지 옵션을 조합하여 사용하면 원하는 방식대로 출력이 가능합니다. 옵션은ls -options
로 사용하면 됩니다. option들은 여러개 붙여서 사용할 수 있습니다. 예를 들어ls -al
과 같이 사용하면 됩니다.ls -a
: 현재 경로의 전체 목록을 보여줍니다.ls -l
: 목록을 1줄 간격으로 출력해 줍니다. 보기 좋아서 이 옵션은 꼭 넣어주시는 것이 좋습니다.ls -t
: modify 된 최근 순서대로 보여줍니다.ls -r
: option들을 이용하여 조합한 출력 결과를 역순으로 보여줍니다. 예를 들어ls -tr
은 modify가 오래된 순서대로 보여줍니다.
df, du : 디스크 및 하위 디렉토리 용량 확인
df -k
: 킬로바이트 단위로 현재 남은 용량을 확인합니다.df -m
: 메가바이트 단위로 남은 용량을 확인합니다.df -h
: 한 줄씩 보기 좋게 정리해서 용량을 보여줍니다. (이 명령어를 사용하길 권장합니다.)df .
: 현재 디렉토리가 포함된 파티션의 남은 용량을 확인합니다.
- 현재 디렉토리 기준으로 용량을 확인하려면
du
를 사용하시기 바랍니다. du -a
: 현재 디렉토리의 사용량을 파일단위로 출력합니다.du -s
: 총 사용량을 확인합니다.du -h
: 한 줄씩 보기 좋게 정리해서 용량을 보여줍니다. (이 명령어를 사용하길 권장합니다.)du -d depth
: 현재 디렉토리 기준으로 몇 depth 까지 보여줄 지 정합니다. 예를들어du -d 1 h
와 같이 사용할 수 있습니다.du -sh *
: 한단계 서브디렉토리 기준으로 보여줍니다.
tar : 리눅스 파일 압축 및 해제
- 리눅스에서
tar
관련 압축을 할 때,tar
와tar.gz
키워드를 볼 수 있습니다. -
tar
는 리눅스의 압축방식으로 파일을 묶는 역할을 하고gz
는 압축하는 역활을 합니다. 따라서tar
는 파일을 묶어서 하나의 파일로 만드는 역할을 하는 것으로 볼 수 있으면tar.gz
는 묶은 하나의 파일을 압축 하는 용도로 볼 수 있습니다. tar로 압축
:tar -cvf [파일명.tar] [폴더명]
- 예시 :
tar -cvf aaa.tar abc
(abc라는 폴더를 aaa.tar로 압축)
- 예시 :
- ` tar 압축 풀기
:
tar -xvf [파일명.tar]`- 예시 :
tar -xvf aaa.tar
(aaa.tar라는 tar파일 압축을 풀고자 한다면)
- 예시 :
tar.gz로 압축
:tar -zcvf [파일명.tar.gz] [폴더명]
- 예시 :
tar -zcvf aaa.tar.gz abc
(abc라는 폴더를 aaa.tar.gz로 압축)
- 예시 :
tar.gz 압축 풀기
:tar -zxvf [파일명.tar.gz]
- 예시 :
tar -zxvf aaa.tar.gz
(aaa.tar.gz라는 tar.gz파일 압축)
- 예시 :
- tar를 사용할 때, 옵션을 추가할 수 있습니다. 아래는 tar의 대표적인 옵션입니다.
-c
: 파일을 tar로 묶음-p
: 파일 권한을 저장-v
: 묶거나 파일을 풀 때 과정을 화면으로 출력-f
: 파일 이름을 지정-C
: 경로를 지정-x
: tar 압축을 풂-z
: gzip으로 압축하거나 해제함
Could not get lock /var/lib/dpkg/lock - open 오류 수정
- 리눅스에서
sudo apt-get install
을 이용하여 패키지를 설치하는 도중 오류가 발생하면 이후에 더이상 패키지 설치가 안되는 경우가 발생합니다. - 이것은 패키지가 설치되는 부분에
lock
이 발생한 것으로 그 부분에 해당하는lock
을 아래 명령어를 통하여 제거하면 됩니다.
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
텍스트파일 내의 행의 갯수를 알고 싶은 경우
ls | wc -l
명령어를 이용하면 new line의 갯수를 카운트 할 수 있습니다.
리눅스 특정 폴더 이하 파일 개수 세기
- 어떤 특정 경로 이하에 존재하는 파일의 갯수를 셀 때,
find
명령어와wc -l
을 이용하여 확인할 수 있습니다.
find /폴더/경로 -type f | wc -l
- 만약 현재 경로 이하의 모든 파일의 갯수를 확인하고 싶으면 경로에
.
을 입력하면 됩니다.
find . -type f | wc -l
텍스트 파일 행 단위 정렬
sort
는 텍스트로 된 파일의행
단위 정렬을 할 때 사용하는 명령어 입니다.- 행단위 오름차순 정렬 :
sort 텍스트파일
- 행단위 내림차순 정렬 :
sort -r 텍스트파일
하부 디렉토리 구조 복사하기
- 어떤 지점의 하부 디렉토리 전체 구조를 복사하고 싶은 경우
find
명령어와mkdir
명령어를 이용하여 디렉토리 구조만 복사할 수 있습니다. - 명령어 :
find path/source -type d -exec mkdir -p path/dest/{} \;
- 예를 들어 현재 경로 및에 a, b 폴더가 있고 a 폴더 및의 디렉토리 구조를 b 폴더 및으로 복사하고 싶으면
find ./a -type d -exec mkdir -p ./b/{} \;
로 나타낼 수 있습니다.
- 위 명령어를 분석해 보면 다음과 같습니다.
find path -type d
는 path의 하부 디렉토리를 모두 찾는 명령어 입니다.-exec
을 통해 find 명령어의 결과를 이용하여 mkdir를 실행합니다. 이 때, find 명령어의 결과는mkdir -p path/dest/{}
의{}
에 전달됩니다.mkdir -p
에서-p
의 의미는 생성하려는 디렉토리의 중간 경로가 없으면 생성하는 의미입니다. 예를 들어 a/b/c 구조에서 c를 생성하려는데 중간 디렉토리인 b가 없으면 b도 같이 생성하겠다는 의미입니다. 단순히 mkdir을 사용하였을 때, 중간 경로가 없으면 에러가 발생합니다.-exec
명령어의 끝을 알려주기 위하여\;
을 입력해 줍니다. 마치 c언어에서 세미콜론을 찍어서 명령어의 끝을 알려주는 것과 같습니다.
하부 디렉토리 구조 출력
- 하부 디렉토리 구조를 출력할 때에는 find 명령어와 그 옵션을 잘 이용하면 됩니다. 명령어는 다음과 같습니다.
find /path/ -type d -print
zip, unzip을 이용한 분할 압축 및 해제
- 먼저 리눅스에서
zip
,unzip
은 추가 설치가 필요하므로 다음과 같이 설치합니다. apt-get install zip unzip
- 먼저 zip을 이용하여 파일을 압축하는 가장 기본적인 방법은 다음과 같습니다.
zip {압축 파일명}.zip {압축할 파일 혹은 디렉토리1} {압축할 파일 혹은 디렉토리2}...
- 먼저 zip을 이용한 분할 압축 방법은 다음과 같은 형태로 사용 합니다.
zip -s 분할압축사이즈 압축결과파일명 압축할파일명
(ex. zip -s 100k -o zipped_file.zip file_to_be_zipped.txt)- 위 명령어에서
-s
는 사이즈와 관련된 옵션입니다. k (kilobytes), m (megabytes), g (gigabytes) 지정할 수 있습니다. 예) 100k, 200m, 300g - 압축 하였을 때, 결과에서
deflated
비율이 퍼센트로 출력됩니다. 얼만큼 압축되었는 지에 대한 비율이고 100에 가까울수록 압축이 잘 된 것으로 볼 수 있습니다. - 분할 압축 결과는 예를 들어 다음과 같이 나열 됩니다.
zipped_file.z01
zipped_file.z02
zipped_file.z03
zipped_file.z04
zipped_file.z05
zipped_file.zip
- 다음으로 분할 압축 해제 방법은 다음과 같이 사용할 수 있습니다.
- 먼저 분할된 파일을 하나의 파일로 합칩니다.
zip -s 0 분할압축된_대표파일 --out 합쳐진압축파일
(ex. zip -s 0 zipped_file.zip –out joined_zip_file.zip)- 하나로 합쳐진 압축 파일을 해제합니다.
unzip 합쳐진압축파일
(ex. unzip joined_zip_file.zip)