ホスト名をリストし、すぐ下の行にソルトミニオンの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: