"search_string"이라는 단어가 포함된 모든 줄 + 그 뒤의 줄 + "mod"와 일치하는 그 앞의 줄을 가져오고 싶습니다.
나는 시도했다:
grep -n 'mod\|search_string' ip | grep --before 1 search_string> inter
grep -n --after 1 search_string ip >> inter
sort -t':' -k1,1n -u inter -o op
더 좋은 방법이 있나요?
문서:
mod start1
some lines
mod start2
other lines
mod start3
many other lines
search_string yada yada
hello
many other lines
search_string yada yada
bye
mod start4
search_string baba baba
this too
mod start5
예상 출력:
mod start3
search_string yada yada
hello
search_string yada yada
bye
mod start4
search_string baba baba
this too
답변1
awk '
$0 ~ /mod/ { md=$0 }
$0 ~ /search_string/ { if(md!="") { print md }; md="" ; print; getline; print }
'
설명하다:
- 포함된 행
mod
은md
. search_string
md
이전에 저장된 라인 , 라인 자체 및 다음 라인 의 인쇄를 트리거하는 라인을 포함합니다 .if(md!="")
그리고md=""
(귀하의 예에서) 단일 아래에mod
-s가 여러 개 있을 때 중복된 줄이 표시되지 않는지 확인하십시오.search_string
mod
mod start3
노트:
mod
및를 포함하는 행은search_string
이 논리를 깨뜨립니다.
답변2
파일에 "캐리지 리턴" 문자가 포함되어 있습니다. Unix에서는 제거하는 것이 가장 좋습니다. 게시한 명령 시퀀스를 인쇄하려면(캐리지 리턴 제거) 다음을 시도하십시오.
awk '{gsub(/\r/,"")}
/mod/ { a = $0 }
/search_string/{ if(a!=""){print(a);a=""}
print;getline;print
}
' infile
또는 한 줄로:
$ awk '{gsub(/\r/,"")}/mod/{a=$0}/search_string/{if(a!=""){print(a);a=""}print;getline;print}' infile
mod start3
search_string yada yada
hello
search_string yada yada
bye
mod start4
search_string baba baba
this too
(GNU) awk에서는 다중 문자 레코드 구분 기호를 사용할 수 있으므로 레코드 구분 기호를 로 설정할 수 mod
있으며 원래 레코드를 재구성하려면 printf만 search_string
필요합니다.
게시한 내용을 "예상 출력"으로 인쇄하려면 다음을 시도해 보세요.
awk '/search_string/{printf("mod%s", $0)}' RS=mod infile
답변3
Python 스크립트에서 이 작업을 수행하려면 다음을 수행하세요.
# Read file into memory.
with open('myfile.txt') as f:
lines = [line.rstrip() for line in f]
# Loops through lines backwards, looking for string and optionally mod.
output_lines = list()
find_mod = False
for i, line in enumerate(lines[::-1]):
if 'search_string' in line:
output_lines.append(lines[::-1][i-1])
output_lines.append(lines[::-1][i])
find_mod = True
elif find_mod and 'mod' in line:
output_lines.append(lines[::-1][i])
find_mod=False
print("\n".join(output_lines[::-1]))