💲

シェルワンライナーから学んだこと

2022/10/20に公開

ワンライナーをひたすら書いていく本を積読していたので、興味もあるしせっかくだし、やろうということで以下の本をやっています。(面白いです。)
https://store.shopping.yahoo.co.jp/bookfan/bk-4297122677.html?sc_i=shp_pc_search_itemlist_shsrg_img
ここで初めて知ったこととかをここにツラツラと書いていきます。
初めて知ったこととかって、かっこ付けましたが、出てくるコマンドほとんど初見です。
あくまで自分用のメモに自分で調べたりしたもので2次、3次ソースくらいなので参考程度に...mm
全部やってから公開しようと思ったけど、年末とかになりそうなのでやるたびに追記していきます。
間違い等ありましたらご指摘いただけると幸いです。
本の正誤表などは以下のリポジトリで対応していただいてるようです。
https://github.com/shellgei/shellgei160

  • 実行環境
    • Ubuntu-20.04(wsl)

echo

オプション

[-e]

与えられた引数のメタ文字(\n)などを認識できるようにする。

awk

awk [options] [--] 'program' file ...

行ベースで処理を行うコマンド

cat hoge.txt | awk '$1=="fuga" {print $2}'

上の例だとfugaと一致する行の2列目を出力する。$1は受け取った行の一列目。$0は行全体。
文法など参考になった
awkでのprintfは改行がつかない。printはつく。

オプション

[-F]

列の区切り文字を指定できる。デフォルトでは区切り文字は空白やタブ

awk -F :

-Fのあとの:が区切り文字になる。

変数

[NR]

NRは行番号が入るawkの変数。

[NF]

列番号が入っている。

演算子

[~]

正規表現にマッチしたときの式で使える。

xargs

「標準入力やファイルからリストを読み込み、コマンドラインを作成して実行する」というコマンド(以下のサイトの文言より

こうすることでそのまま実行できるので便利。
よく見ればxって付いてるし、実行できそうな雰囲気あった。
xargsだけだと標準入力を横並びに出力する。

オプション

[-n]

文字列を任意の数ずつ並べて改行する。
xargs -n2

sedコマンド

行単位で処理される。

sed 's/^/echo /'

で与えられた引数の先頭にechoを付ける。パイプ(|)でbashと書くことでコマンドとして実行できる。連番の大量のファイル作るときに便利そう。curlしてresを見やすくするのに便利でした!

sed 's/xx/yy/g'

gを付けることですべての xxがyyに代わる。

区切り文字、方

/以外にも@, ;, _が使える

/regexp1/,/regexp2/p

regexp1からregexp2までの間を出力。
これはかなり普段から使えそう。監視ツールで見るのめんどくさい??みたいなとき

オプション

[-r, -E, --regexp-extened]

拡張正規表現

grep

オプション

[-l]

grep -l PATTERNS

パターンにマッチした行のファイルの名前だけを取り出すためのオプション。

🚧[-R](自分で調べるの推奨)

ディレクトリとそれに付随するsymlinksに対して再帰的に実行する。
-rオプションや-d recurseオプションに似ているがシンボリックまで見てくれるのが違い?
ディレクトリ以下のファイル名の中身で検索するときに付けると良さそう。

[-o]

普通にgrepするとマッチする行丸ごと取ってきますが、-oオプションを付けることでマッチした部分だけを抜き出せる。

rg(ripgrep)

名前が面白い。

rg [OPTIONS] PATTERN

カレントディレクトリ内のファイルディレクトリをすべて検索する。
-lオプションもgrepと同じ機能。

tac

入力の行を反転して出力する。

$cat hoge.txt
111
222
$tac hoge.txt
222
111

確かにcatの反対の名前だ。

numsum

入力の数値の合計をしてくれるコマンド。

numsum [-OPTIONS [-MORE_OPTIONS]] [--] [PROGRAM_ARG1 ...]

基本的にはパイプでつなげるのが一般的そう。
num-utilsパッケージの中に入っています。
numaverageなどもあるみたい。

uniq

重複行を消す。sortコマンドとのコンボで力を発揮するよう。

オプション

[-c]

重複した行を数える。

wc

word count
引数のファイルの行数、ワード数、バイト数を出力する。

テストコマンド

-e

ファイルが存在するかどうか

リダイレクト

<>リダイレクト記号を組み合わせると「読み書きモードでファイルを開く」

正規表現(linux)

jsとかだと少し違っていたりしたと思います。(?)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions
https://azisava.sakura.ne.jp/programming/0016.html

$(ドルマーク)

行末を示す。

abs$

absで終わる行末を示す。キャレット(^)とセットで覚えるのがよさそう。

*(アスタリスク)

アスタリスクの前にある文字の0回以上の繰り返し。

// aからzのアルファベットが0回以上の繰り返し
[a-z]*

自分はワイルドカードの方の意味の印象が強い。
ワイルドカードでの意味は任意の文字0回以上の繰り返し。

^*

など、前にあるものが文字以外の時はアスタリスクの記号として解釈される

|(パイプ)

コマンドをつなげて標準出力を次のコマンドに受け渡す。
|&で標準出力と標準エラー出力を次のコマンドに渡す。

  • 拡張正規表現のとき
    • orの意味を示す。

セミコロンもチェーン状につなげられるが|は標準出力を次のコマンドに渡すのに対してセミコロンはただコマンドをつなげて行うみたいなイメージを持った。

+

アスタリスクの前にある文字の1回以上の繰り返し.
1回以上というのが肝。

空白

空白は認識される。

🚧後方参照

\1とか
https://www.javadrive.jp/perl/regex/ref/index5.html

ファイルディスクリプタ(0<, 1>, 2>

0<:標準入力
1>:標準出力
2>:標準エラー出力

参考にさせていただいたページ

https://azisava.sakura.ne.jp/programming/0016.html
セミコロン
https://qiita.com/egawa_kun/items/714394609eef6be8e0bf
https://jp.quora.com/Linuxコマンドについて-パイプとセミコロンの違いについ

Discussion