한 줄에서 패턴 일치 전후의 필드 인쇄

한 줄에서 패턴 일치 전후의 필드 인쇄

내 파일에는 다음 데이터가 포함되어 있습니다.

tail fn0 logfile
more  tail3 fn0 logfile1
get than tail4 fn0 logfile2

fn0 이전 필드와 fn0 이후 필드의 출력을 가져오고 싶습니다.

예상 출력:

tail logfile
tail3 logfile1
tail4 logfile2

답변1

당신은 그것을 사용할 수 있습니다 awk:

awk -v pattern="fn0" '{for (i=0;i<=NF;i++) {if ($i==pattern) print $(i-1),$(i+1) }}' file

또는 정규식 패턴을 사용하려는 경우:

awk -v pattern="^fn0$" '{for (i=0;i<=NF;i++) {if ($i~pattern) print $(i-1),$(i+1) }}' file

산출:

tail logfile
tail3 logfile1
tail4 logfile2

답변2

그리고perl

$ perl -lane '($i) = grep {$F[$_] eq "fn0"} 0..$#F;
              print "$F[$i-1] $F[$i+1]"' ip.txt
tail logfile
tail3 logfile1
tail4 logfile2
  • -l입력 줄에서 개행 문자를 제거하고 인쇄할 때 다시 추가합니다.
  • -a공백을 기준으로 입력 라인을 분할하면 @F배열에 데이터가 포함됩니다.
  • ($i) = grep {$F[$_] eq "fn0"} 0..$#F정확한 내용이 있는 요소의 인덱스를 가져옵니다.fn0
  • print "$F[$i-1] $F[$i+1]"필수 입력란을 인쇄하세요


sedERE 지원

$ sed -E 's/^(.* )?([^ ]+) fn0 ([^ ]+).*/\2 \3/' ip.txt
tail logfile
tail3 logfile1
tail4 logfile2
  • ^(.* )?줄 시작 부분의 선택 필드
  • ([^ ]+) fn0 ([^ ]+)전후의 필드 캡처 fn0(단일 공백을 필드 구분 기호로 가정)
  • .*나머지 줄
  • \2 \3출력의 필수 필드

답변3

grep 및 sed를 사용한 솔루션:

egrep -oh '[a-zA-Z0-9]+\ fn0\ [a-zA-Z0-9]+' testfile | sed 's/ fn0 / /'

답변4

$ sed 's/.*\(tail[[:digit:]]*\) fn[[:digit:]]*/\1/' file
tail logfile
tail3 logfile1
tail4 logfile2

sed표현식은 각 줄의 모든 내용을 일치하는 일부 하위 문자열 (여기서 및 양의 정수) tailXX fnYY로 바꿉니다.tailXXXXYY

관련 정보