はじめに
私は普段大学でlinuxを使います。ディレクトリ作成やファイル移動など簡単なことだけですが、コマンドを入力して処理が行われるというのが非常に気に入り、もっとCUIで何かがしたいと考え、衝動的にシェル芸の本を3冊買ってしまいました。痛い出費ですが、買ったからには少しでも早く習得したいと考え、アウトプット代わりに問題を解くために使ったコマンドをまとめることにします。
私が買った本のうちの一冊は「1日1問、半年以内に習得 シェル・ワンライナー160本ノック」というもので、さしあたり1章を終わらせてから本記事を執筆しているので、これからまとめるコマンドはおそらくは基本的なコマンドだと思われます。
目次
はじめに
1.cat
2.sed
3.grep
4.awk
5.sort
6.uniq
7.xargs
8.tr
おわりに
1. cat
catコマンドはファイルの中身をそのまま出力してくれるコマンド。
cat hogehoge.txt
このまま実行してやればファイルの中身が出力される。
オプションとして、-b 空白行を飛ばして行番号を表示
や-n 行番号を表示
などがあります。
似たようなコマンドにtac
というものがあり、こちらはファイルの中身をすべて逆さまにして出力します。
2. sed
sedコマンドは入力されたテキストを置換とかしてくれます。
結構色々使い方があるみたいです。
sed 's/hoge/fuga/' #最初のhogeのみfugaに置換
sed 's/hoge/fuga/g' #すべてのhogeに対してfugaに置換
というように、置換ができたり,
sed -n '/hoge/p' #hogeにマッチした行のみ出力
sed -n '/hoge/,/fuga/p' #hogeにマッチした行からfugaにマッチした行までを出力
という抽出?もできたりします。
-n 自動出力しない(マッチしたり置換したやつ以外出力しない)
検索には正規表現が使えますが、-E 拡張正規表現を認める
を使うと、拡張正規表現も使えるようです。私は拡張正規表現はほとんど知りませんが、それでもカッコで囲んだ部分を\1,\2,...,\nのように変数として扱える後方参照という機能が開放され、それだけでも結構便利な使い方ができます。
3. grep
grep (文字列) #文字列を検索して、マッチした行を出力する。
もちろん正規表現は使えるし、オプション-E 拡張正規表現を認める
もある。-l ファイル名を大量に入れて実行したとき、マッチしたもののファイル名のみを出力。
、-n ファイルを入れて実行したとき、マッチした行を出力する。
というものもある。
-l
については|
パイプラインで入れると(標準入力)としてファイル名が出るので、ファイル名を出したいときはxargsでファイル名を与えて実行してやるといいと思います。
それ以外にも-v マッチしない行を出力。
-o 検索と一致したものを出力する。
-r ディレクトリ以下の位置にあるファイルを全て検索する。
など、便利なオプションが多数ある。
4. awk
コマンドライン上の入力行ごとにを引数に渡し、awkというプログラミング言語を活用することができます。読み込んだ引数は一番左の列を一列目として$1(第1フィールド),$2(第2フィールド),...,$n(第nフィールド)というように変数として呼び出しが可能です。なお、$0は行全体を指します。
awk '条件{処理}' #基本はこの形で使う。条件をパターン、処理をアクション、パターンとアクションの組をルールという。
ルールは2つ以上並べることができます。特殊なパターンとしてBEGINパターン
とENDパターン
が存在しています。
BEGIN{処理} #一行目の処理前に処理が実行されます。
END{処理} #最終行の処理を終えた後、処理が実行されます。
なお、自分で適当な名前の変数を宣言することもできます。特に型はないようで、文字列か数字かを自分で判断してくれるみたいです。連想配列や、for文とかif文とかもかけます。
他にもawkの内部で独自の変数(組み込み変数というらしい)が使えるようで、NF Number of Fields、各行の列数
というものがある。
オプションとして、`-F(文字) デフォルトで空白が設定されている区切り文字を(文字)に変更する。-F:で区切り文字を:にできます。
5. sort
テキストをソートしてくれます。-k (数字) (数字)列目を基準にソートしてくれる
、-n 数字としてソート
、-t (なんか文字) 区切り文字をデフォルトの空白から(なんか文字)に変えてソートする
というオプションがあります。
6. uniq
連続行の出力や削除をしてくれます。-c 出現回数を行の前に出力してくれます。
というオプションがあります。sort+uniqで文字列カウントに使えるみたいです。
7. xargs
入力から文字列を読み込み、それをコマンドに引数として渡した後に実行させます。
cat hoge.txt | xargs #xargsは何も指定しないとechoコマンドが実行される。
seq 10 | xargs -I@ mkdir #(数字)というディレクトリが作成される。
個人的に相当便利だな?と思いました。-n(数字) 引数が入る上限を決める。(数字)個が上限になる。``-I@ @をプレースホルダとして指定する。
プレースホルダは要はこれから入れる値を予め変数として呼び出せる文字、みたいな認識でいいと思います。
8. tr
tr hoge fuga #hogeをfugaに置換する。
tr -d hoge #hogeを削除する。
tr -s hoge #hogeの繰り返しを一つにまとめる
sedみたいに置換や削除ができるみたいです。-c hoge以外をfugaで置換
など、便利な機能がありますが、sedと結構機能が被ってるな、とも思いました。trとsedで違うところがあればぜひコメント欄で教えてください。
おわりに
以上、シェル芸本を解く際に使った、基本的な(と思われる)コマンドをまとめました。何かしら間違いや問題等ありましたら、ぜひ教えてください。
参考文献
上田隆一,山田泰宏,田代勝也,中村壮一,今泉光之,上杉尚史.「1日1問、半年以内に習得 シェル・ワンライナー160本ノック」.技術評論社.2021
沓名亮典.「Linuxコマンドポケットリファレンス」.技術評論社.2015
ITmedia.「Linux基本コマンドTips」.[https://atmarkit.itmedia.co.jp/ait/series/3065/].(参照 2024-01-02)