파이프라인

|문자를 이용하여 명령의 결과를 뒤의 명령어에 넘길 수 있게 하는 것.

다중 조건 grep ( less 명령어는 스크롤할 수 있도록 출력하는 것을 의미)
grep "/api" api.log | grep "/data" | less

압축되어 있는 로그파일 읽기

zcat : .gz.tgz를 처리한다.
zcat api.log.gz | grep "/api" | less
xzcat : .xz 처리
xzcat api.log.xz | grep "/api" | less

내용이 추가될 때마다 그 부분을 실시간으로 출력하기

tail 명령어에 -F옵션을 붙여 활용
tail -F api.log | grep "/api" | grep "/reservation" | less

자동화 스크립트(셸 스크립트)

셸 스크립트 : 명령어를 세로로 연결하여 작성자가 의도한 대로 한줄씩 실행하는 것.

셸 스크립트 생성하기
vim setup.sh

가장 첫줄에 셔뱅(shebang : 스크립트를 실행하는 프로그램)을 지정한다. 예로 perl용 셔뱅은 #!/usr/bin/perl bash가 처리해야하는 것이라면 #!/bin/bash

#!/bin/bash
echo "create test folder "
mkdir test
cd test

:wq로 저장 후 나가기.

권한 주기
chmod +x setup.sh
파일 실행시키기
./setup.sh

프로그램을 실행시키듯이 파일명을 입력하여 실행할 수 없다. 파일명을 쳐서 실행이 가능하게 되는 파일은 /bin/이나 /usr/bin/ 같은 특별한 장소에 있을 때 뿐이다.

이전 명령어가 이상이 생겼을 때 실행 중지하기
if [ $? != 0 ]; then exit; fi

셸 스크립트를 실행할 때는 명령어 입력에 사용하는 셸과는 별도로 프로세스가 생겨 그안에 스크립트가 실행되기 때문에 exit명령어를 호출하는 것이다.

변수 선언
변수명=log=/var/log/apache/access.log

사용시에는 ${변수명} 또는 $변수명으로 쓴다.

변수에는 옵션또한 사용할 수 있다.

tar_compress="tar cfv"
eval "$tar_compress directory"

eval 명령어에 문자열 형식으로 넘기면 명령어열로 실행 가능하다.

환경 변수

환경 변수를 잘 이용한다면 여러 컴퓨터에서도 유연성있게 동작한다. 예로 환경 변수 중에는 ${HOME}이라는 환경 변수가 정의되어 있는데

mkdir ${HOME}/test

위와 같은 셸 스크립트를 각각 다른 컴퓨터와 사용자도 동일하게 작동한다.

mo유저로 접속하여 실행하면 /home/mo/test

jong 유저로 접속하여 실행하면 /home/jong/test

로그 파일에서 필요한 줄만 뽑기

필요없는 줄을 제외시키기

/live라는 문자열을 포함하지 않는 줄만 출력
cat /var/log/apache2/access.log | grep -v "/live"
줄 안에 필요한 부분만 추출하기(cut)
cat /var/log/apache2/access.log | grep -v "/live" | cut -d " " -f 7

-d옵션은 구분자, -f옵션은 구분자로 나누었을 때 필요한 문자열 부분

정렬과 유니크
cat /var/log/apache2/access.log | grep -v "/live" | cut -d " " -f 7 | sort | uniq -c | less

유니크 명령어는 위 아래의 줄들을 비교해서 체크하기 때문에 정렬을 먼저 시킨 후 한다.

uniq 명령어에서 -c,--count를 통해서 uniq실행 결과에 각각 내용이 몇 번 등장했는지를 출력해준다.

각 내용이 몇 번 있는지 숫자를 출력했다면 이를 다시 sort 시킨다.
cat /var/log/apache2/access.log | grep -v "/live" | cut -d " " -f 7 | sort | uniq -c | sort -r | less

마치며

  • 리눅스의 파이프라인은 정말 편하다!!!
  • 셸 스크립트를 잘 작성해야한다.
  • 로그를 분석하는 방법을 배워봤다.