テキスト処理
並べ替え・切り出し・加工
sort・uniq・cut・tr・paste・tee・xargs など、テキストを加工してパイプでつなぐためのコマンド。
これらのコマンドは単体より、| でつないで使うことがほとんどです。
sort並べ替える
行を並べ替えます。数値順・逆順・特定の列での並べ替えもできます。
| オプション | 意味 |
|---|---|
-n | 数値として並べる |
-h | 2K 1G などの単位付きの数値として並べる |
-r | 逆順 |
-u | 重複を除く |
-k N | N列目で並べる(-k2,2 で2列目だけ) |
-t , | 区切り文字(既定は空白) |
-f | 大文字小文字を区別しない |
-V | バージョン番号として並べる(1.2 < 1.10) |
$ sort names.txt
$ sort -nr scores.txt
$ sort -t, -k3,3n data.csv # CSVの3列目を数値で
$ du -sh * | sort -h
$ sort -u emails.txt > unique.txtuniq連続する重複をまとめる
uniq は隣り合った重複しかまとめないので、先に sort します。
$ sort list.txt | uniq # 重複を除く
$ sort list.txt | uniq -c | sort -rn # 出現回数の多い順
$ sort list.txt | uniq -d # 重複しているものだけ
$ sort list.txt | uniq -u # 1回しか出てこないものだけcut列を切り出す
区切り文字や文字の位置を指定して、各行の一部を切り出します。
$ cut -d: -f1 /etc/passwd # : 区切りの1列目(ユーザー名)
$ cut -d, -f1,3 data.csv # 1列目と3列目
$ cut -c1-10 file.txt # 1〜10文字目tr文字を置き換える / 削除する
文字を別の文字に置き換えたり、削除したりします。大文字・小文字の変換にも使えます。
$ 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行につなげたりします。
$ paste names.txt ages.txt # 2つのファイルを列として並べる
$ paste -sd, list.txt # 全行を , でつないで1行にtee画面とファイルの両方に出す
画面に表示しながら、同じ内容をファイルにも保存します。
$ 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 N | 1回にN個ずつ渡す |
-I {} | {} の位置に1つずつ埋め込む |
-0 | ヌル文字区切りで受け取る(find -print0 と組み合わせる) |
-P N | N並列で実行 |
-r | 入力が空なら実行しない |
$ 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 -dfold / fmt長い行を折り返す
長い行を指定した幅で折り返します。
$ fold -w 80 long.txt
$ fmt -w 72 README.txt # 単語の区切りで整えるrev各行を左右逆にする
各行の文字を左右逆にします。
$ echo "path/to/file.tar.gz" | rev | cut -d. -f1 | rev # 最後の拡張子 → gzshufランダムに並べる / 選ぶ
行をランダムに並べ替えたり、ランダムに選んだりします。
$ shuf -n 1 members.txt # ランダムに1人選ぶ
$ shuf -i 1-100 -n 5 # 1〜100 から5個seq連番を作る
連続した数字を出力します。
$ seq 5 # 1〜5
$ seq -w 1 10 # 01〜10(桁を揃える)
$ seq 0 5 100 # 0 から 5 刻みで 100 までcomm並べ替え済みの2ファイルを比べる
並べ替え済みの2つのファイルを比べて、共通の行や片方にだけある行を出します。
$ comm -12 <(sort a.txt) <(sort b.txt) # 両方にある行
$ comm -23 <(sort a.txt) <(sort b.txt) # a にだけある行jqJSON を整形・抽出する
Ubuntu には最初から入っていません。 で入れられます。
JSON を見やすく整形したり、必要な部分だけ取り出したりします。
$ 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.jsonliconv文字コードを変換する
文字コードを変換します。Excel で作った CSV の文字化けを直すのによく使います。
$ 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 には最初から入っていません。 で入れられます。
日本語の文字コードを自動で判別して変換します。
$ nkf --guess file.txt # 文字コードと改行を推測
$ nkf -w --overwrite *.txt # UTF-8 に一括変換
$ nkf -Lu file.txt # 改行を LF にdos2unix改行コードを変換する
Ubuntu には最初から入っていません。 で入れられます。
Windows の改行(CRLF)と Linux の改行(LF)を変換します。
$ dos2unix script.sh # CRLF → LF(Windows で作ったスクリプトが動かないとき)
$ unix2dos readme.txt # LF → CRLF入っていなければ sed -i 's/\r$//' file でも同じことができます。
expand / unexpandタブと空白を変換する
タブを空白に、空白をタブに変換します。
$ expand -t 4 main.c > spaces.c # タブを空白4つに
$ unexpand -t 4 --first-only a.txt # 行頭の空白をタブにsplitファイルを分割する
大きなファイルを、サイズや行数ごとに分割します。
$ 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パターンで区切って分割する
パターンに一致する行ごとにファイルを分割します。
$ csplit -z notes.md '/^## /' '{*}' # ## の見出しごとにファイルを分けるjoin共通の列で2つのファイルを結合する
共通の列をキーにして、2つのファイルを横に結合します。
$ join -t, <(sort users.csv) <(sort orders.csv) # 1列目が一致する行を横につなぐ
$ join -1 2 -2 1 a.txt b.txt # a の2列目と b の1列目で結合envsubstテンプレートの変数を埋め込む
テンプレートの中の ${変数} を、環境変数の値で置き換えます。
$ export DOMAIN=example.com PORT=3000
$ envsubst < nginx.conf.template > nginx.conf # ${DOMAIN} などを置き換える
$ envsubst '${DOMAIN}' < tmpl > out # 指定した変数だけ置き換えるyes同じ文字列を出し続ける
同じ文字列(既定は y)を出し続けます。確認の質問に自動で答えるのに使います。
$ yes | sudo apt install something # 質問にすべて y で答える
$ yes "test" | head -5pr印刷用に整形する・段組み
テキストを段組みにしたり、2つを並べたりします。
$ pr -3 -t list.txt # 3段組み
$ pr -m -t a.txt b.txt # 2つのファイルを並べて表示look前方一致で探す
並べ替え済みのファイルから、前方一致で素早く探します。
$ look prog /usr/share/dict/words # 並べ替え済みのファイルから前方一致で探す(速い)yqYAML を jq のように扱う
Ubuntu には最初から入っていません。 で入れられます。
Ubuntu の apt で入る yq は jq の書き方をそのまま使える Python 版です(Go 版の mikefarah/yq とはオプションが違います)。
$ 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 → JSONxmlstarletXML を抽出・編集する
Ubuntu には最初から入っていません。 で入れられます。
XML から値を取り出したり、整形したりします。
$ xmlstarlet sel -t -v '//item/title' feed.xml
$ xmlstarlet fo feed.xml # 整形mlr (Miller)CSV / TSV / JSON を表として扱う
Ubuntu には最初から入っていません。 で入れられます。
CSV や TSV を表として扱い、絞り込み・並べ替え・集計ができます。
$ 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