파이프 ( ‘|’)로 구분 된 레코드가있는 파일이 있습니다. 6 번째 열에서만 특정 문자열을 검색 한 다음 grep 유틸리티를 통해 전체 줄을 반환해야합니다. 총 10 개의 기둥과 9 개의 파이프가 있습니다. 아래 예제 줄에서 ‘G50483’을 검색해야합니다. 두 번째 레코드 만 반환해야합니다. :-
3DEAC-9AF7-4EEE-9ACD-A6E376C5727C | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D ||Y| 610535 | DEFERRAL-TASK CLAIMED | RON BOW - ORD Arv 10-SEP-2015 20:48, BOW-Line 2 Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 1G50483 every 50FH to ensure no additional damage is present|| GMT |11-SEP-11
26BDF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED |RON BOW - ORD Arv 25-SEP-2015 21:46, BOW-Line 6 Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N G50483 every 50FH to ensure no additional damage is present || GMT | 27-SEP-10
G50483 26B2F1DF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED | RON BOW - ORD Arv 25-SEP-2015 21:46, BOW-Line 6 Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 3G50483 every 50FH to ensure no additional damage is present|| GMT | 27-SEP-05
답변
그것이 있어야하는 경우 grep
:
grep -Em2 "([^|]+|){6}[^|]+G50483.*' file | tail -n1
-E
확장 정규 표현식을 활성화합니다-m2
두 번째 경기에서 멈춤'...'
정규식[^|]+|
+
파이프|
와 파이프가 아닌 하나 이상의 ( ) 문자를 검색합니다 .(...){6}
이 작업은 6 번 연속으로 수행되므로 7 번째 필드에 있습니다. 귀하의 질문에 6 번째 필드가 언급되어 있지만 입력 예제로 인해 7 번째 필드를 가정했습니다.{5}
원하는 경우로 변경하십시오 .[^|]+
이제 마지막 검색 패턴까지 파이프가 아닌 문자를 다시 검색합니다.G50483
실제 패턴
tail -n1
때문에, 필요한grep
만 만 n 번째 선두로부터 인쇄 할 수 없습니다,tail
다른 선두로부터 단지 2 일 appreas를 잘라냅니다.
답변
유닉스에서는 툴킷을 제공하기 때문에 작업에 적합한 툴을 선택해야합니다. grep 은 전체 라인에서 작동합니다. 대신 awk를 사용하십시오.
awk -F "|" '$6 ~ /G50483/ { print $2; }'
-F
필드 분리기 “|” 이 경우$6
검색 할 열입니다.~
패턴과 일치합니다 (정확한 일치에 ==를 사용할 수 있음)/pattern/
검색 패턴$2
-두 번째 필드 ($0
모든 줄)
자세한 정보는 여기 : 효과적인 AWK 프로그래밍-4e .