다음과 같은 텍스트 파일(구분 기호로 공백 포함)이 있습니다.
Date Time---------OtherFields-------Source IP Destination IP
2014-11-24 12:58:59.290 1.2.3.4 5.6.7.8
2014-11-24 12:59:01.402 1.2.3.8 5.6.7.8
2014-11-24 13:00:01.542 12.14.25.1 5.6.7.8
2014-11-25 14:00:02.5 12.14.25.2 5.6.7.8
2014-11-25 15:00:01.542 12.14.25.1 6.7.8.9
2014-11-25 16:00:01.542 12.14.25.5 6.7.8.9
대상 IP 5.6.7.8의 경우 최신 날짜와 시간이 있는 행을 선택하고 추가 처리를 위해 새 텍스트 파일에 저장하고 싶습니다. 모든 다른 대상 IP 주소에도 동일하게 적용됩니다. 이런 라인이 많이 있습니다.
이것원하는 출력이렇습니다.
2014-11-25 14:00:02.5 12.14.25.2 5.6.7.8
2014-11-25 16:00:01.542 12.14.25.5 6.7.8.9
나는 논리가 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사해요
답변1
for dest in $(awk '{print $NF}' mylogfile | sort | uniq)
do
grep ${dest} mylogfile | sort -k1 -k2 | tail -1
done
1 $(awk '{print $NF}' mylogfile | sort | uniq)
로그 파일의 각 줄의 마지막 필드(대상 IP)를 인쇄합니다. 동일한 IP 주소가 연속된 블록에 있도록 정렬합니다. uniq는 동일한 라인 블록의 인스턴스 하나만 인쇄합니다.
2 & 4 do ... done
나는 이것이 자명하다고 생각합니다. 일반 루프 구조
3 grep ${dest} mylogfile | sort -k1 -k2 | tail -1
IP 주소가 하나인 행을 찾으려면(IP 주소가 마지막 필드를 제외한 다른 필드에서 반복되지 않는다고 가정) 필드 1을 먼저 정렬한 다음 최신 날짜/타임스탬프가 포함된 필드 2를 정렬합니다. 마지막 줄을 입력합니다. tail -1
마지막 줄을 잡아라
답변2
다음을 시도해 볼 수 있습니다 awk
.
awk '{ x = $1" "$2; if (x > a[$4]) { a[$4] = x; b[$4] = $0; } } END { for (i in b) { print b[i]; } }' file
그러나 메모리에 두 개의 배열을 보유하므로 매우 큰 파일에는 그다지 유용하지 않을 수 있습니다.