나는 다음을 가지고 있습니다 file.log
:
2018.03.02 R:123-123 [Debug] Parameters AAA ...
2018.03.02 R:123-124 [Debug] Parameters BBB ...
2018.03.02 R:123-125 [Debug] Parameters CCC ...
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...
2018.03.02 R:456-456 [Debug] Parameters ZZZ ...
2018.03.02 R:123-123 [Debug] Parameters XYZ ...
저는 주로 독서 $2
와 $5
칼럼에 관심이 있습니다.
두 번째 열의 동일한 값과 다른 다섯 번째 열의 값을 모두 찾고 싶습니다.
이것이 내가 얻는 것입니다:
$ awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1
2 XXX R:123-456
2 DDD R:123-126
그러나 나는 더 적은 수의 파이프를 사용하는 더 효율적인 방법을 찾고 있습니다.불다그리고앗스크립트로 또는 명령줄에서.
출력은 유사할 수도 있고 전체 라인이 인쇄될 수도 있습니다. 위 출력의 문제점은 주어진 두 번째 열의 모든 항목을 표시하지 않는다는 것입니다. 마지막 줄도 고려되지 않습니다 ( XYZ
).
다음과 같이 쓸 수도 있습니다불다:
$ grep -f <(awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1 | awk '{print $3}') file.log
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...
그러나 이 명령은 을 사용하여 행을 인쇄하지 않으며 R:123-123
두 번째로 큰 파일에는 효율적이지 않습니다.
유효한 예상 결과는 다음과 같습니다.
- 가 있는 행에는 , 의
R:123-123
두 가지 다른 매개변수가 있기 때문입니다AAA
.XYZ
- 가 있는 행에는 , 의
R:123-126
두 가지 다른 매개변수가 있기 때문입니다DDD
.EEE
- 가 있는 행에는 , 의
R:123-456
두 가지 다른 매개변수가 있기 때문입니다XXX
.YYY
어떻게 하면 이를 보다 효율적으로 달성할 수 있습니까?
답변1
Awk
+sort
해결책:
awk 'a[$2]++ && $5 != f5{ print r ORS $0 }{ r=$0; f5=$5 }' <(sort -k2,2 file)
산출:
2018.03.02 R:123-123 [Debug] Parameters AAA ...
2018.03.02 R:123-123 [Debug] Parameters XYZ ...
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...