2013-04-10 2 views
0

사용자가 로그온 한 총 시간을 확인하려고 로그 파일을 검색하고 있습니다. 로그인 및 로그 오프와 관련없는 모든 행을 이미 제거했습니다. 그러나 어떤 이유로 우리는 해당 로그 아웃 라인이없는 로그인 라인을 가지고 있으므로이를 제거하고 싶습니다. 예를 들어 :여러 줄 패턴과 일치하지 않는 줄을 제거하십시오.

2013-04-07 08:44:01 [INFO] User logged in 
2013-04-07 08:54:55 [INFO] User logged in 
2013-04-07 08:57:12 [INFO] User logged in 
2013-04-07 08:59:45 [INFO] User logged in 
2013-04-07 09:01:28 [INFO] User logged in 
2013-04-07 09:11:00 [INFO] User logged in 
2013-04-07 09:12:56 [INFO] User logged in 
2013-04-07 09:15:43 [INFO] User lost connection 

을 내가 원하는 단지

2013-04-07 09:12:56 [INFO] User logged in 
2013-04-07 09:15:43 [INFO] User lost connection 
+0

이 행에 여러 '사용자 손실 connection' 라인이있을 수 있습니까? –

답변

1

다음 작업을해야합니다 명령 구분자 :

sed -e '/User logged in/{h 
d 
}' -e 'H' -e 'x' file 
+0

감사합니다. 사람들이 제시 한 모든 답변이 효과가있었습니다. –

1

문제를 해결할 수있는 한 줄이 AWK : (. 적어도 당신의 예를 들어 실제 파일은 내가 볼 수 없습니다)

awk -F\[ '{a[$2]=$0;}END{for(x in a)print a[x]}' file 
데이터와

시험 :

kent$ echo "2013-04-07 08:44:01 [INFO] User logged in 
2013-04-07 08:54:55 [INFO] User logged in 
2013-04-07 08:57:12 [INFO] User logged in 
2013-04-07 08:59:45 [INFO] User logged in 
2013-04-07 09:01:28 [INFO] User logged in 
2013-04-07 09:11:00 [INFO] User logged in 
2013-04-07 09:12:56 [INFO] User logged in 
2013-04-07 09:15:43 [INFO] User lost connection"|awk -F\[ '{a[$2]=$0;}END{for(x in a)print a[x]}'                   
2013-04-07 09:12:56 [INFO] User logged in 
2013-04-07 09:15:43 [INFO] User lost connection 

동일한 로그인의 경우 마지막 하나만 인쇄됩니다.

kent$ cat file 
2013-04-07 09:11:00 [INFO] User logged in 
2013-04-07 09:12:56 [INFO] User logged in 
2013-04-07 09:15:43 [INFO] User lost connection 
2013-04-08 09:11:00 [INFO] User logged in 
2013-04-08 09:12:56 [INFO] User logged in 
2013-04-08 09:15:43 [INFO] User lost connection 

다음이 라인이 작동 : 당신이 같은 여러 개의 로그인 잃어버린 연결 블록을 가질 수

: 편집

나는 당신의 실제 파일이 경우에있을 수 있습니다 생각 너 :

awk '/lost/{print a;print;next;}{a=$0}' file 

출력은 다음과 같습니다

sed '/User logged in/{h;d};H;x' file 

을 또는 당신이 시스템에있는 경우로 ;를 지원하지 않는 : 행에 여러 User lost connection 라인이 없을 것이라고 가정

2013-04-07 09:12:56 [INFO] User logged in 
2013-04-07 09:15:43 [INFO] User lost connection 
2013-04-08 09:12:56 [INFO] User logged in 
2013-04-08 09:15:43 [INFO] User lost connection 
1

awk 솔루션을 표시 할 수 있습니다. 한 줄에 "로그인 된"문자열이 있으면 그 줄을 저장하십시오. 줄에 "로그인 된"문자열이 없으면 마지막으로 저장된 줄을 인쇄하고 현재 줄을 인쇄합니다. 두 개의 "연결 끊김"줄이 서로 이어질 수있는 경우 문제가 될 수 있습니다. Awk는 다른 라인들도 걸러 낼 수있는 좋은 선택이 될 수 있습니다.

#!/bin/bash 

awk '!/logged in/ {print x"\n"$0} {x = $0}' <<EOT 
2013-04-07 08:44:01 [INFO] User logged in 
2013-04-07 08:54:55 [INFO] User logged in 
2013-04-07 08:57:12 [INFO] User logged in 
2013-04-07 08:59:45 [INFO] User logged in 
2013-04-07 09:01:28 [INFO] User logged in 
2013-04-07 09:11:00 [INFO] User logged in 
2013-04-07 09:12:56 [INFO] User logged in 
2013-04-07 09:15:43 [INFO] User lost connection 
EOT 
0

당신 (GNU이 나오지도)에 대한이 작동 될 수 있습니다

sed -r '$!N;/(User logged in)\n.*\1/D' file 
관련 문제