/Linuxコマンド

テキスト処理

並べ替え・切り出し・加工

sort・uniq・cut・tr・paste・tee・xargs など、テキストを加工してパイプでつなぐためのコマンド。

これらのコマンドは単体より、| でつないで使うことがほとんどです。

sort並べ替える

行を並べ替えます。数値順・逆順・特定の列での並べ替えもできます。

オプション意味
-n数値として並べる
-h2K 1G などの単位付きの数値として並べる
-r逆順
-u重複を除く
-k NN列目で並べる(-k2,2 で2列目だけ)
-t ,区切り文字(既定は空白)
-f大文字小文字を区別しない
-Vバージョン番号として並べる(1.2 < 1.10)
bash
$ sort names.txt
$ sort -nr scores.txt
$ sort -t, -k3,3n data.csv      # CSVの3列目を数値で
$ du -sh * | sort -h
$ sort -u emails.txt > unique.txt

uniq連続する重複をまとめる

uniq は隣り合った重複しかまとめないので、先に sort します。

bash
$ sort list.txt | uniq               # 重複を除く
$ sort list.txt | uniq -c | sort -rn # 出現回数の多い順
$ sort list.txt | uniq -d            # 重複しているものだけ
$ sort list.txt | uniq -u            # 1回しか出てこないものだけ

cut列を切り出す

区切り文字や文字の位置を指定して、各行の一部を切り出します。

bash
$ cut -d: -f1 /etc/passwd            # : 区切りの1列目(ユーザー名)
$ cut -d, -f1,3 data.csv             # 1列目と3列目
$ cut -c1-10 file.txt                # 1〜10文字目

tr文字を置き換える / 削除する

文字を別の文字に置き換えたり、削除したりします。大文字・小文字の変換にも使えます。

bash
$ echo "Hello" | tr 'a-z' 'A-Z'      # 大文字にする
$ tr -d '\r' < win.txt > unix.txt    # Windowsの改行(CRLF)をLFにする
$ tr -s ' ' < file.txt               # 連続する空白を1つにまとめる
$ echo "$PATH" | tr ':' '\n'         # PATH を1行ずつに

paste行を横につなぐ

複数のファイルを横に並べたり、全行を1行につなげたりします。

bash
$ paste names.txt ages.txt           # 2つのファイルを列として並べる
$ paste -sd, list.txt                # 全行を , でつないで1行に

tee画面とファイルの両方に出す

画面に表示しながら、同じ内容をファイルにも保存します。

bash
$ make 2>&1 | tee build.log
$ echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf
$ echo "line" | sudo tee -a /etc/some.conf    # 追記

xargs入力を引数にして実行する

前のコマンドの出力を引数にして、別のコマンドをまとめて実行します。

オプション意味
-n N1回にN個ずつ渡す
-I {}{} の位置に1つずつ埋め込む
-0ヌル文字区切りで受け取る(find -print0 と組み合わせる)
-P NN並列で実行
-r入力が空なら実行しない
bash
$ find . -name '*.tmp' -print0 | xargs -0 rm -f
$ cat urls.txt | xargs -n1 -P4 curl -sO       # 4並列でダウンロード
$ ls *.png | xargs -I{} convert {} {}.jpg
$ git branch --merged | grep -v main | xargs -r git branch -d

fold / fmt長い行を折り返す

長い行を指定した幅で折り返します。

bash
$ fold -w 80 long.txt
$ fmt -w 72 README.txt       # 単語の区切りで整える

rev各行を左右逆にする

各行の文字を左右逆にします。

bash
$ echo "path/to/file.tar.gz" | rev | cut -d. -f1 | rev   # 最後の拡張子 → gz

shufランダムに並べる / 選ぶ

行をランダムに並べ替えたり、ランダムに選んだりします。

bash
$ shuf -n 1 members.txt      # ランダムに1人選ぶ
$ shuf -i 1-100 -n 5         # 1〜100 から5個

seq連番を作る

連続した数字を出力します。

bash
$ seq 5                      # 1〜5
$ seq -w 1 10                # 01〜10(桁を揃える)
$ seq 0 5 100                # 0 から 5 刻みで 100 まで

comm並べ替え済みの2ファイルを比べる

並べ替え済みの2つのファイルを比べて、共通の行や片方にだけある行を出します。

bash
$ comm -12 <(sort a.txt) <(sort b.txt)    # 両方にある行
$ comm -23 <(sort a.txt) <(sort b.txt)    # a にだけある行

jqJSON を整形・抽出する

Ubuntu には最初から入っていません。 で入れられます。

JSON を見やすく整形したり、必要な部分だけ取り出したりします。

bash
$ curl -s https://api.github.com/repos/cli/cli | jq .
$ jq '.name, .stargazers_count' repo.json
$ jq -r '.[] | .name' list.json             # 配列の各要素の name を文字列で
$ jq '.items | length' data.json
$ jq -c 'select(.level == "error")' log.jsonl

iconv文字コードを変換する

文字コードを変換します。Excel で作った CSV の文字化けを直すのによく使います。

bash
$ iconv -f SHIFT_JIS -t UTF-8 sjis.csv > utf8.csv     # Windows(Excel)の CSV を UTF-8 に
$ iconv -f UTF-8 -t CP932 utf8.txt > win.txt
$ iconv -l | grep -i jis                              # 使える文字コード
$ file -i data.csv                                    # 今の文字コードを調べる

nkf日本語の文字コード・改行を自動判別して変換

Ubuntu には最初から入っていません。 で入れられます。

日本語の文字コードを自動で判別して変換します。

bash
$ nkf --guess file.txt          # 文字コードと改行を推測
$ nkf -w --overwrite *.txt      # UTF-8 に一括変換
$ nkf -Lu file.txt              # 改行を LF に

dos2unix改行コードを変換する

Ubuntu には最初から入っていません。 で入れられます。

Windows の改行(CRLF)と Linux の改行(LF)を変換します。

bash
$ dos2unix script.sh            # CRLF → LF(Windows で作ったスクリプトが動かないとき)
$ unix2dos readme.txt           # LF → CRLF

入っていなければ sed -i 's/\r$//' file でも同じことができます。

expand / unexpandタブと空白を変換する

タブを空白に、空白をタブに変換します。

bash
$ expand -t 4 main.c > spaces.c     # タブを空白4つに
$ unexpand -t 4 --first-only a.txt  # 行頭の空白をタブに

splitファイルを分割する

大きなファイルを、サイズや行数ごとに分割します。

bash
$ split -b 100M big.iso part_          # 100MB ごとに part_aa, part_ab…
$ split -l 1000 -d data.csv chunk_     # 1000行ごと、番号付き(chunk_00…)
$ split -n 4 video.mp4 v_              # 4等分
$ cat part_* > big.iso                 # 元に戻す

csplitパターンで区切って分割する

パターンに一致する行ごとにファイルを分割します。

bash
$ csplit -z notes.md '/^## /' '{*}'    # ## の見出しごとにファイルを分ける

join共通の列で2つのファイルを結合する

共通の列をキーにして、2つのファイルを横に結合します。

bash
$ join -t, <(sort users.csv) <(sort orders.csv)     # 1列目が一致する行を横につなぐ
$ join -1 2 -2 1 a.txt b.txt                         # a の2列目と b の1列目で結合

envsubstテンプレートの変数を埋め込む

テンプレートの中の ${変数} を、環境変数の値で置き換えます。

bash
$ export DOMAIN=example.com PORT=3000
$ envsubst < nginx.conf.template > nginx.conf           # ${DOMAIN} などを置き換える
$ envsubst '${DOMAIN}' < tmpl > out                      # 指定した変数だけ置き換える

yes同じ文字列を出し続ける

同じ文字列(既定は y)を出し続けます。確認の質問に自動で答えるのに使います。

bash
$ yes | sudo apt install something      # 質問にすべて y で答える
$ yes "test" | head -5

pr印刷用に整形する・段組み

テキストを段組みにしたり、2つを並べたりします。

bash
$ pr -3 -t list.txt          # 3段組み
$ pr -m -t a.txt b.txt       # 2つのファイルを並べて表示

look前方一致で探す

並べ替え済みのファイルから、前方一致で素早く探します。

bash
$ look prog /usr/share/dict/words    # 並べ替え済みのファイルから前方一致で探す(速い)

yqYAML を jq のように扱う

Ubuntu には最初から入っていません。 で入れられます。

Ubuntu の apt で入る yq は jq の書き方をそのまま使える Python 版です(Go 版の mikefarah/yq とはオプションが違います)。

bash
$ yq -r '.services.web.image' compose.yaml       # 値を取り出す(-r で文字列をそのまま)
$ yq -y '.version = "2.0"' config.yaml         # 結果を YAML で出す
$ yq -yi '.version = "2.0"' config.yaml        # 直接書き換える
$ yq . config.yaml                                # YAML → JSON

xmlstarletXML を抽出・編集する

Ubuntu には最初から入っていません。 で入れられます。

XML から値を取り出したり、整形したりします。

bash
$ xmlstarlet sel -t -v '//item/title' feed.xml
$ xmlstarlet fo feed.xml              # 整形

mlr (Miller)CSV / TSV / JSON を表として扱う

Ubuntu には最初から入っていません。 で入れられます。

CSV や TSV を表として扱い、絞り込み・並べ替え・集計ができます。

bash
$ mlr --icsv --opprint cat data.csv                  # 表の形で見る
$ mlr --icsv --ojson filter '$price > 1000' data.csv
$ mlr --icsv --opprint sort -nr price then head -n 5 data.csv
$ mlr --icsv --opprint stats1 -a mean,sum -f price -g category data.csv