特定の単語を見つけてテキストを取得するためにgrepする方法

特定の単語を見つけてテキストを取得するためにgrepする方法

ホスト名をリストし、すぐ下の行にソルトミニオンのping結果を表示するテキストファイルがあります。以下はサンプル出力です。

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:

関連情報