내 파일에는 다음 데이터가 포함되어 있습니다.
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]"
필수 입력란을 인쇄하세요
sed
ERE 지원
$ 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
로 바꿉니다.tailXX
XX
YY