私はあなたの評議会を探しています。
与えられたファイルのすべての行を配列に読み込み、一連のステートメントを実行して、そのパラメータがtrueかfalseかを確認したいと思います。
以下は、各行の値を配列に抽出するなどのファイルIDの例です。
2019-11-07 10:07:08,000 p=28290 u=root | ansclient2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2019-11-07 12:48:42,438 p=1830 u=root | ansclient : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
だから努力しています -
while read -r row ; do
args=${row[@]}
#pid
pc=${row[2]}
#hostname
hn=${row[5]}
#failed row
st=${row[10]}
echo $pc
echo $hn
echo $st
if [ $st -eq "failed=0" ] ; then echo "true"
else
echo "failed is something other than 0"
echo $hn $st
fi
期待どおりに動作しません。 [trueの場合]各行を配列として繰り返し、 'failed ='の値を比較して0または他の値であることを確認したいと思います。
誰でも助けてくれたら本当にありがとうございます。
事前にありがとう
答え1
これらのファイルを読むには、以下を使用することをお勧めしますawk
。
awk '{
print $3
print $6
print $11
if ($11 == "failed=0") print "true"
else print "failed is something other than 0"
}' file
答え2
@pLumoが言ったように、awk
これは単に印刷したい場合はより良いツールです。これらの変数を使用して他の素晴らしい操作を実行し、それをbashスクリプトで使用する必要がある場合は、配列をread
直接読み取るようにコマンドを変更することをお勧めします。
row
行全体(variables)と配列(variables)が必要な場合は、args
次のように書くことができます。
while IFS= read -r row; do
read -r -a args <<< "$row"
# ...
done
デフォルトではIFS
すべてのスペースに設定されています。入力がセミコロンで区切られた列を含むCSVファイルの場合は、IFS
それに応じてそれを設定できます。
while IFS= read -r row; do
IFS=';' read -r -a args <<< "$row"
# ...
done
答え3
pLumoの答えで判断したら - これが私が選んだものです -
#!/bin/bash
#transform the log
grep -i recap -A1 ansible.log |grep -iv recap |grep -v "\-\-" > ansible2.log
#get status of output of said ansible2.log with a success status along with the hostname
#of the job
awk '{print $3, $6, $10, $11
if ($10 == "unreachable=0") print "DEVICE WAS REACHABLE 0"
else if($10 != "unreachable=0") print "DEVICE WAS UNREACHABLE 1"
if ($10 == "unreachable=0")
if ($11 == "failed=0") print "NOTHING FAILED, was successful run"
else print $11 " is something other than 0"
else print $10 " was unreachable" }' ansible2.log
また、rexkogitansメソッドを使用したいが、IFS
正常に動作しません。 。
IFSがログを1行ずつ読み取って繰り返すことができるように値を入力しようとしています。代わりに、私のコードは無限に繰り返されるか、変数を正しく埋めません。 (
このコードから多くの出力を取得します。 [4行のログファイルの112行と同じです。正確ではありません! ]
#!/bin/bash
while IFS='' read -r line
do
for i in $line
do
echo "pid is $i ${os[1]} , host is $i ${os[2]}, success is $i ${os[3]}, failed is $i ${os[4]}"
echo "done for that line"
done
done <ans.log
たとえば、次のような出力を取得します。
pid is 2019-11-07 , host is 2019-11-07 , success is 2019-11-07 , failed is 2019-11-07
done for that line
pid is 10:07:08,000 , host is 10:07:08,000 , success is 10:07:08,000 , failed is 10:07:08,000
done for that line
pid is p=28290 , host is p=28290 , success is p=28290 , failed is p=28290
done for that line
pid is u=root , host is u=root , success is u=root , failed is u=root
done for that line
pid is | , host is | , success is | , failed is |
変数を正しく入力できず、代わりに
正しく呼び出すのではなく、一度に1つずつ繰り返すようです。どんなアイデアがありますか?
すべての助けに感謝します。早く回答できなくてすみません。テストも必要で、一晩中システム管理者の仕事をしました。
ありがとう、=-ブライアン