반응형

아래와 같은 데이터가 있다고 가정해보자.

 

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}'이라고 해주면 공백 기준으로 두번째 내용, 첫번재 내용으로 생성해주기에 원하는 결과를 얻을 수 있게 된다.

 

반응형