[shell] 리눅스 텍스트 명령 라인 사용 기법
리눅스에서 어떤 명령어를 수행하면, 대부분 모니터 혹은 파일에 어떤 결과를 나타내는
텍스트가 디스플레이 됩니다.
이를 통해 우리는 알고 싶어하던 결과를 확인할 수가 있습니다. 혹은 이런 결과들을 서
로 조합하거나, 분리하거나, 원하는 내용만을 뽑아서 다른 이름의 파일로 저장하고 싶
기도 할 것입니다.
이런 작업을 편하게, 그리고 깔끔하게 할 수 있도록 도와주는 명령 및 유틸리티들을 여
기서 소개합니다.
물론, 같은 결과를 얻어 내는데는 여러 가지 방법(눈으로 열심히 원하는 답을 골라낸다
든가… ^^)이 있겠지만, 좀 더 알고 있다면, 누군가로 부터, “현재 사용자가 몇 명이야?”
와 같은 질문을 받았을 때 신속한 답변을 할 수 있는 능력있는 관리자가 되리라 생각합
니다.
정규표현식(Regular Expression)
정확한 문자열을 패턴, 즉 골라내고자 하는 대상으로 정하지 않고, 보다 일반적인 문자열
을 패턴으로 지정할 때 사용하게 되는 것이 “정규 표현식”입니다.
예를들면, “A로 시작하고, 세글자인 단어가 포함된 줄을 모두 골라라!”, “‘/bin/bash’로
끝나는 라인을 모두 보여달라!”라는 식의 명령을 말합니다.
정규 표현식은 grep 뿐 아니라, 비슷한 용도로 ed, sed, awk, …에서도 사용되며, vi와
emacs에서도 제한적으로 사용됩니다.
무엇을 골라내라고 좀 더 포괄적으로 명령하기 위해서는 정규 표현식에 사용되는 기호
가 무엇을 의미하는지에 대해 조금 알고 있어야 합니다.
사용되는 기호를 정리해 보면, 다음과 같습니다.
기호
설 명
. 한문자 일치.
c..l 이라면, cool, coal등이 해당됩니다. ‘.’하나에 한문자씩 매치되므로.
* 0개 이상의 문자와 매치.
c*l 이라면, corel, cool,coal, cristal… 모두 해당됩니다.
c로 시작해서 l로 끝나는 모든 것이 해당되죠.
^ 라인의 처음과 패턴과 매치
$ 라인의 끝이 패턴과 매치
< 단어의 시작이 패턴과 매치되는 단어를 가진 라인을 고를때
> 단어의 끝이 패턴과 매치되는 단어를 가진 라인을 고를때
[] 괄호안의 문자 중 하나 혹은 정해진 범위와 매치
[^] 괄호 밖의 문자와 매치
\ 이 다음에 나오는 특수문자를 글자 그대로 인식하여 매치
grep Family
어떤 패턴을 포함하고 있는 라인을 찾고자 할 때, 유용하게 사용하는 명령이 바로
grep 명령입니다.
grep은 기본적으로 주어진 파일 혹은 표준입력을 통해 들어온 내용(예를들어, 명령의
결과를 입력으로 사용할 수도 있습니다.)에서 원하는 패턴을 포함하고 있는 라인을 찾
아서 화면에 보여 줍니다.
grep (Generalized Regular ExPressions)은 큰 사이즈의 텍스트 파일 혹은 표준 입
력사항에서 특정 패턴을 포함하고 있는 라인을 찾아서 보여 줍니다.
다음 세가지의 종류가 있습니다.
grep [옵션] 패턴 [대상파일들]
강력한 패턴 매칭 템플릿을 정의하기 위해 “정규 표현식”을 사용할 수 있다.
egrep [옵션] “패턴|패턴|…” [대상파일들]
확장된 정규 표현식을 사용하며,
찾아낼 패턴을 여러개 지정할 수 있다. ‘|’기호는 불린 연산자 “OR”에 해당하므로,
정해진 패턴들에 포함되는 모든 라인을 보여준다.
fgrep [옵션] 패턴 [대상파일들]
패턴과 정확히 일치하는 것만을 찾아 준다.
공통적인 옵션
옵션
-v 패턴과 일치하지 않는 라인을 보여준다.
-c 패턴과 일치되는 라인의 갯수만을 보여준다.
-i 대소문자 구분없이 보여준다.
-n 패턴과 일치하는 라인의 라인넘버를 앞에 붙여서 보여준다.
지금까지 익힌 내용을 응용해 보겠습니다. 결과를 예상해 보고, 명령을 내려 확인해 보세요.
(답을 가르쳐 주지 않는다고 불평하지 마세요, 실행만 해본다면 쉽게 답을 알 수 있고 훨씬
쉽게 이해 할 수 있으니까요!)
# ls | grep ‘^g’
# grep ’50.’ /etc/passwd
# ls -a | grep ‘^.[a-zA-Z0-9]’
# fgrep httpd /var/log/messages
# ls /etc | egrep “conf|cfg”
텍스트 처리를 위한 명령어들
유닉스는 전통적으로 표준 입력으로부터 얻어지는 캐릭터들을 읽고 어떤 방식으로 처리
하고, 그 결과를 표준 출력으로 내보내기 위한 여러종류의 유틸리티들 (혹은 명령어들이
라고 할 수도 있겠습니다.)을 제공합니다. 복잡한 텍스트 처리를 이런 유틸리티들을 파이프
들을 통해 연결하므로써 처리할 수 있도록 해줍니다. 이 유틸리티들의 대부분과 이와 연관된
프로그램들은 GNU ‘textutils’ 패키지에 포함되어 있습니다.
# rpm -ql textutils | grep /usr/bin
이러한 유틸리티들은 명확하지 않은 사용법을 가질 수도 있습니다. 즉, 꼭 이렇게 쓰여야만
한다는 단순한 사용법이 아니고, 필요에 따라 여러 가지 형태로 사용될 수 있는 것입니다.
그 활용 범위가 매우 다양합니다.
예를들어, 리눅스는 파일의 내용을 모니터에 보여주는 명령을 따로 가지지 않습니다. 대신,
‘cat’ 같은 명령으로 이러한 작업이 가능합니다.
# cat /etc/passwd
이 명령은 모니터에 / etc/passwd 파일의 내용을 보여줄 것입니다. 이것을 조금 응용해
본다면, 출력 위치를 재지정하여, 모니터가 아닌 파일로 그 결과를 저장할 수도 있을 것입
니다. 이렇게 하면, cp 명령을 쉽게 만들어 낼 수도 있을 것입니다.
‘cat’의 다른 사용예를 보면,
# cat test{1,2,3} > test.results
이것의 결과는 test1, test2, test3 라는 파일의 내용을 모두 포함하는 test.results라는
이름의 새로운 파일을 생성하는 것입니다.
또 다른 예로, 다음은 ‘cut’을 사용하여, 현재 등록되어 있는 사용자들이 사용하는 쉘을
보여 주는 명령입니다.
# cut -d: -f7 /etc/passwd | sort | uniq
먼저 사용자 정보가 들어있는 /etc/passwd 파일을 읽고, sort 명령으로 정렬한 뒤,
중복되는 쉘인 경우는 출력에 포함시키지 않도록 uniq처리를 한 것입니다.
텍스트 처리를 위한 명령어들입니다.
자세한 설명과 용법은 info 혹은 man 페이지로부터 도움을 받으세요.
comm
정렬된 두 파일의 공통된 라인을 비교
csplit
주어진 인수를 기준으로 파일을 분리
cut
하나 혹은 그 이상의 파일들로부터 선택된 컬럼들과 필드들을 잘라낸다.
expand
주어진 파일의 Tab을 그에 맞는 SPACE로 변경
fmt
라인을 추가하거나, 삭제하여, 특정 폭의 텍스트로 변환
fold
정해진 길이 보다 크지 않도록 라인 폭을 자른다.
head
주어진 파일의 처음 부분을 원하는 라인수 만큼 출력
join
주어진 두 파일의 같은 라인을 출력
nl
주어진 파일의 라인을 붙여서 출력
paste
주어진 파일들을 병합, 각 컬럼은 기본적으로 Tab으로 나눔.
ex) # paste data1 data2 > data3
data1과 data2 두 개의 컬럼으로 된 파일 data3를 만들다.
pr
파일을 출력을 위한 형식으로 바꾸어 준다.
split
큰 파일을 여러개의 파일로 나눈다. 기본적으로 1000라인.
sum
checksum을 파일의 블록수등을 계산하고 출력. 파일전송 후 확인하는데 유용.
tac
라인을 반대로 위치시켜 출력한다. 맨 끝줄이 맨 앞으로.
tail
파일의 마지막 열줄을 출력
tr
문자를 변환한다.
ex) # cat test | tr ‘[A-Z]’ ‘[a-z]’
‘test’라는 파일에 있는 대문자를 소문자로 바꿔서 출력한다.
unexpand
SPACE 문자를 Tab 문자로 변환
uniq
중복된 라인을 지운다.
ex) # sort names | uniq -c
‘names’ 파일을 정렬하고 중복된 경우 중복된 갯수를 앞에 출력
wc
문자, 단어, 줄수를 출력한다.
ex) # who | wc -l
who 명령 결과의 라인 수 (= 현재 사용자의 수를 출력)