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番目のバージョンを好むが、それは問題ではない。