ループと変数の読み込み中

ループと変数の読み込み中

私はあなたの評議会を探しています。

与えられたファイルのすべての行を配列に読み込み、一連のステートメントを実行して、そのパラメータが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つずつ繰り返すようです。どんなアイデアがありますか?

すべての助けに感謝します。早く回答できなくてすみません。テストも必要で、一晩中システム管理者の仕事をしました。

ありがとう、=-ブライアン

関連情報