최신 날짜와 시간이 있는 행을 선택하는 방법

최신 날짜와 시간이 있는 행을 선택하는 방법

다음과 같은 텍스트 파일(구분 기호로 공백 포함)이 있습니다.

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

그러나 메모리에 두 개의 배열을 보유하므로 매우 큰 파일에는 그다지 유용하지 않을 수 있습니다.

관련 정보