특정 단어를 찾고 텍스트를 가져오기 위해 grep하는 방법

특정 단어를 찾고 텍스트를 가져오기 위해 grep하는 방법

호스트 이름을 나열하고 바로 아래 줄에 솔트 미니언에 대한 핑 결과를 표시하는 텍스트 파일이 있습니다. 다음은 샘플 출력입니다.

T5F6Z12:
   Minion did not return. [Not connected]

먼저 미니언이 반환하지 않은 텍스트가 있는지 식별하고, 그렇다면 해당 서버에 대해 다른 명령을 실행할 수 있도록 오류와 관련된 호스트 이름을 가져와야 합니다.

이것이 내가 시작한 방법입니다.

if grep -q "Minion" /srv/salt/test/ping_results
then
    

따라서 "Minion"이라는 단어는 테스트가 실패한 서버에만 표시되므로 grep을 통해 검색해야 한다고 확신합니다. 그러나 일단 존재한다고 확신하면 그 위에 연결된 호스트 이름을 텍스트 파일로 가져오는 방법을 알 수 없습니다.

답변1

-B1다음을 사용하여 이전 줄을 인쇄한 다음 첫 번째 줄만 가져올 수도 있습니다 .

$ grep -B1 'Minion' ip.txt
T5F6Z12:
   Minion did not return. [Not connected]
$ grep -B1 'Minion' ip.txt | head -n1
T5F6Z12:

또는 다음을 사용하십시오 awk.

$ awk '/Minion/{print p} {p=$0}' ip.txt
T5F6Z12:
$ awk '/Minion/{sub(/:$/, "", p); print p} {p=$0}' ip.txt
T5F6Z12

여기에 마지막 줄을 계속 저장하세요 p. 입력 줄에 가 포함되어 있으면 Minion인쇄됩니다. grep첫 번째 일치 항목만 제공하는 위의 솔루션 과 달리 이는 여러 일치 항목에 대해 작동합니다 .

답변2

묶여 있으면 grep계속해서 멀티 라인을 플레이할 수 있습니다.

문서:

T5F6Z12:
   Minion did not return. [Not connected]
T5F6Z11:
   Pinion did return. [connected]
T5F6Z10:
   Minion did not return. [Not connected]

사용

grep -B 1 "Minion" file | grep ":$"
T5F6Z12:
T5F6Z10:

써보시면 sed답이 있어요여기 있어요U&L에서 나는 아래 내용을 표절했습니다.

sed -n '/Minion/{x;p;d;}; x' file
T5F6Z12:
T5F6Z10:

관련 정보