![Grep은 패턴 이전에 가장 최근 줄을 찾습니다.](https://linux55.com/image/7788/Grep%EC%9D%80%20%ED%8C%A8%ED%84%B4%20%EC%9D%B4%EC%A0%84%EC%97%90%20%EA%B0%80%EC%9E%A5%20%EC%B5%9C%EA%B7%BC%20%EC%A4%84%EC%9D%84%20%EC%B0%BE%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
GREP를 사용하여 "User-Agent: UA"에 대한 파일을 검색한 다음 "Via:"가 포함된 가장 가까운 줄을 추출하고 싶습니다. 내 문제는 때때로 "Via:"가 포함된 여러 줄이 있지만 마지막 줄만 원한다는 것입니다. .
예를 들어 구문 분석할 파일은 다음과 같습니다.
Via: 1.1.1.1
not relevant line
...
not relevant line N
User-Agent: UA
...
Via: 2.2.2.2
Via: 3.3.3.3
not relevant line
...
not relevant line N
User-Agent: UA
...
Via: 4.4.4.4
Via: 5.5.5.5
Via: 6.6.6.6
not relevant line
...
not relevant line N
User-Agent: UA
내가 원하는 결과는 "User-Agent:UA"에 가장 가까운 "Via:"를 포함하는 행입니다.
Via: 1.1.1.1
Via: 3.3.3.3
Via: 6.6.6.6
어떤 도움이라도 대단히 감사하겠습니다.
답변1
awk
다음을 수행할 수 있습니다.
awk '/Via/ {via_line=$0} /User-Agent: UA/ {print via_line}' input_file
따라서 Via
해당 줄을 포함하는 모든 줄을 찾아 저장하고 이전 줄을 덮어쓴 다음 해당 줄을 찾으면 해당 줄에 대해 저장한 모든 내용을 User-Agent: UA
인쇄합니다 .Via
답변2
sed를 사용하세요:
sed -n '/^Via/h;/^User-Agent: UA$/{g;p;}' file
산출:
통과됨: 1.1.1.1 경로: 3.3.3.3 경로: 6.6.6.6
자동 인쇄를 비활성화하는 패턴 공간을 사용하십시오 -n
. 복사 모드에서 줄이 Via
공백으로 시작하는 경우 공백을 저장합니다( h
). 예약된 공간을 덮어쓰게 됩니다. 라인에 "User-Agent: UA"가 포함되어 있으면 예약된 공간을 패턴 공간( g
)에 복사하고 패턴 공간( p
)을 인쇄합니다.