馬とテニスのIT革命
馬とテニスとリラックマが好きな IT 系のエンジニアです。
シェル

Linuxのコマンドの結果をパイプで次のコマンドの任意の位置に使う方法

タイトルだけ見ると何を言っているのかよくわからないかもしれませんが、要は Linux や Mac のターミナル上で以下のようなことがしたいわけです。

複数行のテキストデータから 1 行目を取り出し、その 1 行から最初の空白までの項目を curl コマンドのリクエストヘッダ指定に使用する。

$ cat hoge.txt | head -n1 | awk '{print $1}' | curl -H 'Content-Type: コンテントタイプ' https://exaple.org/

ちょっと強引なサンプルですが、リクエストヘッダの「コンテントタイプ」の部分に「application/json」や「text/xml」を動的に入れたいってわけですね。
(すぐに最適なサンプルが思い付かなかった)

コマンドの最後であれば xargs を素で使うのですが、コマンドの途中の場合はどうしたらいいでしょうか。

シェルの変数に格納する

パイプで繋ぎまくって 1 行コマンドでやらずに、シェルスクリプトを書くパターンです。

一定数の処理があったり、使い回す場合はこちらの方が吉ですからね。
(エラー制御は無視してます)

#!/bin/sh

CONTENT_TYPE=`cat hoge.txt | head -n1 | awk '{print $1}'`

curl -H "Content-Type:${CONTENT_TYPE}" https://exaple.org/

一時的な調査や、それほどパイプを多用しないコマンドであればワンライナーでもいいと思いますが、何度も使うならシェルスクリプトで書いておくと便利です。

もう使わないだろって思ったコマンドを history から必死に探す時ってありますしね・・・。

history の履歴はデフォルトの 1000 件から増やしておくことをオススメします(笑)

あわせて読みたい
AWSでWebサーバ用途にEC2(AmazonLinux)の環境を構築するAmazonLinux2 が正式リリースされて 1 ヶ月以上が経過しました。 次に新しく EC2 を作るなら乗り換えるのもアリかな...

まあ、メモリをそれほど消費しないならパイプの連発でもいいですが。

どうしてもワンライナーで済ませたい

確かにコマンドの途中に差し込めなくもないよなって xargs のオプションを探していたら見つけました。

xargs の -I オプションですね(大文字のアイ)

-I replace-str

-I に続けて文字列を定義すると、その文字列が変数のように使用できます。

先ほどのいまいちなサンプルを使うとこんな感じ。

$ cat hoge.txt | head -n1 | awk '{print $1}' | xargs -ICT curl -H 'Content-Type: CT' https://exaple.org/

シングルクォーテーションで囲っても CT が展開されますね。

$ vi hoge.txt

application/json
text/xml

こうしてみるとわかりやすいでしょうか。

$ cat hoge.txt | head -n1 | awk '{print $1}' | xargs -ICT echo 'Content-Type: CT'

Content-Type: application/json

まとめ

今回は強引に curl を例にしましたが、最後に実行するコマンドがメインになることが多いと思います。

引数をたくさん使うコマンドの場合もあるでしょうし、1 箇所だけを動的にしたいなら使う価値はアリですね。

他にも、JSON で返ってきた内容を jq コマンドでパースして、特定の値を別のコマンドに渡したいってケースは遭遇しそうな気もする。

$ curl https://example.org/ | jq -r .data[0].name | xargs -INAME sample_command. -n NAME -a hoge -b fuga
Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/10/20 14:06:04時点 Amazon調べ-詳細)

あなたにオススメ