行を読むとき - 構文の問題

行を読むとき - 構文の問題

OpenStack Swiftアカウントを解析するためにWhile Read Lineステータスを使用しています。以下は、特定の作成/変更日を含むすべてのデータを見つけるために使用する問い合わせの一部のコードです。

まず、次のコマンドを実行してアカウントのすべてのコンテナのリストを取得します。

swift list -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> > containers.txt

このコマンドは以下のようにリストを出力します。

ffd5eef3-2b75-4d4f-b30c-b9836b32a34c

コンテナの内容を表示するために実行できるコマンドは次のとおりです。

swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> ffd5eef3-2b75-4d4f-b30c-b9836b32a34c

1507732 2017-09-27 19:55:57 application/octet-stream ffd5eef3-2b75-4d4f-b30c-b9836b32a34c.FR.02
     1812122 2017-09-27 19:55:57 application/octet-stream ffd5eef3-2b75-4d4f-b30c-b9836b32a34c.FS.02

すべてのコンテナを解析し、特定の日付が「2017-09-27」のコンテナ内のすべてのオブジェクトについて警告するために、次のコマンドを作成しました。

while read line; do echo -e swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> $line | bash; done < containers.txt | awk '{ if ($2 == "2017-09-27") print $0}'

print $ 0ステートメントで$ lineの内容を印刷する方法はありますか?たとえば、出力は次のようになります。

ffd5eef3-2b75-4d4f-b30c-b9836b32a34c 1812122 2017-09-27 19:55:57 application/octet-stream ffd5eef3-2b75-4d4f-b30c-b9836b32a34c.FS.02

編集する:

私はまだこの問題を抱えていますが、今はその理由を知りません。 "containers.txt"ファイルには、私のコマンドに挿入され、正しく機能するコンテナのリスト(ファイルまたはオブジェクトのルート)があります。 AWKステートメントで同じGUIDを印刷できないようです。これは、AWK ステートメントに表示されるファイルのルートディレクトリを見つけることができるようにする必要があります。次の2つのステートメントはまったく同じ出力を生成します。

while read line; do echo -e swift list -l -A http://sslabapi/auth/v1.0 -U auto02 -K [ACCOUNT PASSWORD] $line | bash; done < containers2.txt | awk -v l="$line" '$2 == "2018-05-08" { print l, $0 }'

while read line; do echo -e swift list -l -A http://sslabapi/auth/v1.0 -U auto02 -K [ACCOUNT PASSWORD] $line | bash; done < containers2.txt | awk  '$2 == "2018-05-08" {print $0 }'

出力は次のとおりです。

理想的には、次のようにビルドと出力にルートコンテナを使用したいと思います。

4919d1c8-f5c7-448f-98ad-29d88f1a5a84 9923 2018-05-08 15:56:34 アプリケーション/オクテットストリーム 4919d1c8-f5c7-448f-98ad-29a8

ベストアンサー1

あなたはする必要がありますawk ~へwhile外部からパイプを通過する代わりにループを使用してください。その時点で、ループ変数は範囲外でした(そしてどんな場合でもいくつかの異なる値を取るので、どの値を見たいですか?)。

次のようにすれば大丈夫でしょう。

while read line
do
    swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> "$line" | awk -v line="$line" '{ if ($2 == "2017-09-27") print line $0}'
done < containers.txt

私は彼らが何も達成しなかったので削除しechoました。| bashこれは、1つではなく複数のプロセスを開始することを意味しますawkが、ここでは問題ではありません。

必要に応じて、ループ内のラインとデータをリンクすることもできます。

swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> "$line" | xargs -L 1 echo "$line"

これxargs -L 1コマンドはそのコマンドのすべてのecho "$line" ABC出力行に対してABC実行され、swift list各行の前に追加される効果があります$line。その後、awk外部から既存のデバイスにパイプして代わりに$3テストを調整して$2補償することができます。

どちらがうまく機能するかは、最終目標が何であるか、データがどのように配布されるかによって異なりますが、ここでは両方が同じです。私は個人的に2番目のバージョンを好むが、それは問題ではない。

おすすめ記事