반응형
아래와 같은 데이터가 있다고 가정해보자.
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2022:20:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2022:20:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2018:20:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2018:20:29:12 +0330]
91.99.55.165 [26/Jan/2018:20:29:12 +0330]
91.99.55.165 [26/Jan/2017:21:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2019:22:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
91.99.55.165 [26/Jan/2019:22:29:12 +0330]
91.99.55.165 [26/Jan/2019:22:29:12 +0330]
91.99.55.165 [26/Jan/2013:23:29:12 +0330]
91.99.55.165 [26/Jan/2023:23:29:12 +0330]
91.99.55.165 [26/Jan/2019:20:29:12 +0330]
이때 쉘 스크립트를 통해 날짜를 얻어내고, 해당 날짜의 count들을 얻어내고 싶을때 아래와 같은 명령어를 이용한다.
echo "Get data union and count"
awk '{print $2}' $1 | grep -o '[0-9]\{2\}\/[A-Z][a-z]\{2\}\/[0-9]\{4\}' | sort | uniq -c | awk '{print $2","$1}'
위의 코드가 어떤건지 자세히 분석해보자.
awk '{print $2}' $1
현재 log.txt로 들어온 파라미터가 $1이 되고, awk 명령어를 통해 공백 기준으로 2번째에 있는 값을 얻어낸다.
즉, [26/Jan/2019:20:29:12 가 된다. (+0330]은 또 공백으로 이루어져있기에 포함되지 않는다.)
awk '{print $2}' $1 | grep -o '[0-9]\{2\}\/[A-Z][a-z]\{2\}\/[0-9]\{4\}'
이제 저렇게 얻어낸 코드에서 grep를 통해 정규 표현식으로 값을 찾아내고자 한다.
0~9사이 값이 2개이고 (일/월/년도 중 일에 해당)
그다음 /가 있으며
그다음 첫글자가 대문자고 소문자가 2개가오며
그다음 /가 있으며
마지막으로 숫자 4개를 받는다.
는 정규표현식을 만든다.
이때 -o 옵션은 해당 조건을 통해 추출된 값만 가져오는 역할을 한다. (-o 옵션이 없다면 그냥 찾은 내용을 빨갛게 표시만해줄뿐 전체가 모두 출력된다.)
awk '{print $2}' $1 | grep -o '[0-9]\{2\}\/[A-Z][a-z]\{2\}\/[0-9]\{4\}' | sort
데이터를 정렬해준다.
awk '{print $2}' $1 | grep -o '[0-9]\{2\}\/[A-Z][a-z]\{2\}\/[0-9]\{4\}' | sort | uniq -c
데이터가 같은 값을 병합하여 카운팅해준다. (이때 정렬하지 않고 uniq -c를 하면 원하는 결과가 나오지 않을 수 있다. 해당 내용은 직접 해보도록 하자.) (linear하게 merge해서 counting하므로 다르게 나타난다.)
awk '{print $2}' $1 | grep -o '[0-9]\{2\}\/[A-Z][a-z]\{2\}\/[0-9]\{4\}' | sort | uniq -c | awk '{print $2","$1}'
마지막으로 awk '{print $2","$1}'이라고 해주면 공백 기준으로 두번째 내용, 첫번재 내용으로 생성해주기에 원하는 결과를 얻을 수 있게 된다.
반응형
'Applied > Linux' 카테고리의 다른 글
Linux directory 이동/복사/삭제 (0) | 2022.01.27 |
---|---|
cURL 개념 및 기본 사용 방법 (0) | 2021.04.29 |
inode 그리고 마운트 포인트란? (0) | 2021.02.02 |
쉘 스크립트에서 다른 쉘 스크립트 실행하기 (0) | 2021.01.27 |
[Ubuntu] ssh permission denied (publickey, password) 해결 (0) | 2020.01.22 |