
クリップボードには次の内容が含まれています。
curl "foo" --compressed ;
curl "bar" --compressed ;
curl "baz" --compressed ;
次のコマンドは、クリップボード行ごとに1行を作成します。
pbpaste | awk '{"pwgen 10 1" | getline pass; print substr($0, 1, length($0) -1) ">>myfile-" pass ".jpg"}'
次の出力を生成します。
curl "foo" --compressed >>myfile-du7EeHegh7.jpg
curl "bar" --compressed >>myfile-du7EeHegh7.jpg
curl "baz" --compressed >>myfile-du7EeHegh7.jpg
質問:
ここでの問題は、pwgen 10 1
最初は一度だけ実行されるように見えますが、新しいクリップボード行ごとに実行され、各行に対して新しい一意のファイル名を生成したいということです。pwgen
最初に一度だけ呼び出されるのではなく、繰り返し呼び出すにはどうすればよいですか?
希望の出力:
# each filename is unique
curl "foo" --compressed >>myfile-zus83j10ai.jpg
curl "bar" --compressed >>myfile-nbjfo2pa9d.jpg
curl "baz" --compressed >>myfile-ahqdugpo90.jpg
答え1
awkで外部コマンドを使用して使用します。getline from a Pipe
、コマンドを変数に割り当て、my_command="my external command here"
それを使用して呼び出すことmy_command |getline to_save
をお勧めします。close(my_command)
各実行ごとに出力を異なるようにするためのものです。また、コマンドが実行されないようにclose(my_command)
inブロックを実行することをお勧めします。BEGIN{...}
my_command
また、getline 戻りコードをテストし、成功したら続行する必要があります。
pbpaste |awk 'BEGIN{ close(cmd); }
{ cmd="pwgen 10 1";
if (cmd | getline pass) {
print substr($0, 1, length($0) -1) ">>myfile-" pass ".jpg";
close(cmd);
} else { print "running command failed!"; exit 1; }
}'
しかし、コマンド自体が失敗した場合、コマンドの成功/失敗を確認しないため、getlineはまだ成功した戻りコードを返します。
pbpaste |awk 'BEGIN{ close(cmd); }
{ cmd="pwgen 10 1 || echo failed";
if ((cmd | getline pass)>0 && pass!="failed") {
print substr($0, 1, length($0) -1) ">>myfile-" pass ".jpg";
close(cmd);
} else { print "running command failed!"; exit 1; }
}'
マニュアル引用:
ファイル名が同じか同じシェルコマンド
getline
awkプログラムの実行中に複数回使用されます(getlineを使用した明示的な入力セクションを参照してください。)、ファイルが開きます(またはコマンドが実行されます)初めてのみ。この時点で、ファイルまたはコマンドから最初の入力レコードを読み込みます。次回同じファイルまたはコマンドが getline と一緒に使用されると、ここで別のレコードを読み取るように進みます。
上のリンクからgetlineを使用した明示的な入力話す:
getline コマンドは、レコードが見つかった場合は 1 を返し、ファイルの終わりが見つかった場合は 0 を返します。レコードの検索中にファイルを開くことができないなどのエラーが発生した場合、getlineは-1を返します。この場合、gawk は ERRNO 変数を発生したエラーを記述する文字列に設定します。
また見なさい: