はじめに
シェルを利用した作業において一番最初に初学者が効率化を実感できるものがxargsの活用だと思い、本記事を書きました。
まずは使ってみよう、ということで比較的使いやすく便利なオプションをピックアップしました。
最後にtipsとしてヒアドキュメントとの併用を紹介していますが、あまり見かけないので初学者ではない方にも有用かもしれません
xargsとは
xargsとは標準入力やファイルからリストを読み込んでコマンドライン実行してくれるコマンドです
xargsの有無の違いはcatの処理が分かりやすいですね
❯ ls
foo hoge
❯ cat hoge
fuga
❯ cat foo
bar
❯ ls | cat
foo
hoge
❯ ls | xargs cat
bar
fuga
文字列として渡すのか、パラメータの引数として渡すのかが違う
-Iオプションで位置を自由に
-Iオプションを使用することで直後に指定した文字列を変数のように見立てて引数の位置を自由に変更しコマンドを実行できます。
ちょっとした文字列の加工にも使ったりします。
❯ echo hoge |xargs -I {} mkdir -p {}1/{}2/{}3
❯ ls -R hoge1
hoge2
hoge1/hoge2:
hoge3
hoge1/hoge2/hoge3:
複数のコマンドへ渡したいときは
bashの-cオプションを使い文字列として引数を渡してあげることで複数のコマンド処理も可能です。
下記コマンドはカレントディレクトリにあるファイルを圧縮しつつ、圧縮後の中身をチェックしています。
❯ ls
a.txt b.txt c.txt
❯ cat a.txt
a
❯ ls |xargs -I {} bash -c 'gzip {} && zcat {}.gz'
a
b
c
❯ ls
a.txt.gz b.txt.gz c.txt.gz
よくあるやり方
よくあるやり方としてファイルに引数として渡したい対象を記載し、catでxargsに渡すというものがあります。
下記はドメイン一覧が書かれているdomain.lstをxargsに渡し、ドメイン名とそのIPを出力させています。
❯ cat domain.lst
qiita.com
esu2.co.jp
google.com
❯ cat domain.lst|xargs -I {} bash -c 'echo && echo {} && dig {} +shor'
qiita.com
52.68.203.46
54.150.97.130
3.113.225.145
esu2.co.jp
54.150.23.130
google.com
216.58.220.110
視認性のためにechoで何も引数を指定せず改行させています。
ヒアドキュメントの併用がおすすめ
リスト一覧のファイルを何度も使用する場合には上述のようにcatでファイルの中身を渡してあげてもいいのですが、一度きりの作業に一々ファイルを作ってしまうと消し忘れもありますし、何より手間です。
できるだけメモリで処理したい!と自分は思うので下記のようにヒアドキュメント併用させたものをスニペットに登録して使っています。
あとはリスト一覧をヒアドキュメントの位置に貼り付けて実行したいコマンドを追記するだけでok
cat << eof | xargs -I {}
eof
❯ cat << eof | xargs -I {} bash -c 'echo && echo {} && dig {} +shor'
google.com
qiita.com
esu2.co.jp
eof
google.com
172.217.26.238
qiita.com
52.68.203.46
54.150.97.130
3.113.225.145
esu2.co.jp
54.150.23.130
単純作業の効率化におすすめです。