順番に読み進めながら学べます

整形ツール — sort / uniq / cut / wc / tr / tee

sort -nの並べ替え、sort | uniq -cの重複と出現回数、cut -d',' -f1の列抽出、wc -lの行数、tr 'a-z' 'A-Z' の文字変換、teeの画面とファイル分岐を、1 コマンドずつ図解と端末で実習します。

行を並べ替える — sort

本記事では、テキストを整形・集計する 6 つのコマンド sort / uniq / cut / wc / tr / tee を 1 コマンドずつ実習します。最初はsortです。sortは入力の行を辞書順(文字の並び順)に並べ替えます。数値を大小で並べたいときはsort -n、降順にしたいときはsort -rを使います。辞書順では102より前に来る(先頭の文字12を比較する)ため、数値の並べ替えには-nが必要です。

書き方意味
sort行を辞書順に並べ替える
sort -n行を数値の大小で並べ替える
sort -r並び順を逆(降順)にする
sort は辞書順、sort -n は数値順
文字として比較sort10 2 30nums.txt10 2 30数値として比較sort -n2 10 30
辞書順では先頭の文字を比較するので102より前に来ます。数値順は-nを付けます。
printf 'cherry\napple\nbanana\n' > words.txt   # 3 行の素材を作成
sort words.txt                                   # apple banana cherry(辞書順)
sort -r words.txt                                # cherry banana apple(降順)
printf '100\n9\n25\n' > scores.txt              # 数値の素材を作成
sort scores.txt                                  # 100 25 9(辞書順なので 1 が先頭)
sort -n scores.txt                               # 9 25 100(数値順)

printf '10\n2\n30\n' > nums.txtで数値 3 行の素材を作成してください。

sort nums.txtで並べ替え、辞書順では102より前に来ることを確認してください。

sortに数値順のオプションを付けて、2 → 10 → 30 の順になることを確認してください。

④ さらに逆順のオプションを付けて、大きい順に並ぶことを確認してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 4 実行済み
Loading Linux Terminal...

重複をまとめる — uniq

uniq隣り合って並んだ同じ行を 1 つにまとめるコマンドです。離れた場所にある重複は見ないため、ふつうはsortで同じ行を隣へ揃えてからパイプで渡します。uniq -cを付けると、各行の前に出現回数が付き、種類別の件数集計になります。

書き方意味
uniq隣接する同じ行を 1 つにまとめる
sort file.txt | uniq並べ替えてから渡し、離れた重複もまとめる
uniq -c各行の前に出現回数を付ける
sort で揃えてから uniq でまとめる
b a asorta b b(隣に揃う)uniqab重複が消える
uniqは隣接重複だけ見るので、先にsortで同じ行を隣へ揃えます。
printf 'banana\napple\nbanana\napple\n' > items.txt   # 4 行の素材を作成
sort items.txt                                          # apple apple banana banana
sort items.txt | uniq                                   # apple banana(重複を除去)
sort items.txt | uniq -c                                # 2 apple / 2 banana(出現回数)

printf 'pear\nfig\npear\nfig\nfig\n' > fruit.txtで重複のある 5 行の素材を作成してください。

sort fruit.txtで並べ替え、同じ行が隣り合うことを確認してください。

sortの結果をパイプでuniqに渡し、重複が 1 つにまとまることを確認してください。

④ 同じパイプでuniqに出現回数を付けるオプションを使い、各行の前に回数が出ることを確認してください。

Linux console
0 / 4 実行済み
Loading Linux Terminal...

列を取り出す — cut

cutは各行を区切り文字で分け、指定した列だけを取り出します。-dの後ろに区切り文字、-fの後ろに列番号を書き、cut -d',' -f1なら CSV の 1 列目を抜き出せます。複数列なら-f1,3のようにカンマで並べます。CSV やコロン区切りの設定ファイルから必要な列だけを取り出すときに使います。

書き方意味
cut -d',' -f1カンマ区切りの 1 列目を抽出する
cut -d':' -f1:区切りの 1 列目を抽出する
cut -d',' -f1,31 列目と 3 列目をまとめて抽出する
cut は区切りで分けて列を選ぶ
cut -d',' -f1sato,30,tokyo1 列目sato2 列目303 列目tokyo-f1 で sato だけ出力カンマで 3 つに分割
-dの区切り文字で行を分割し、-fの番号の列だけが出力されます。
printf 'root:x:0\nuser:x:1000\n' > passwd.txt   # コロン区切りの素材を作成
cut -d':' -f1 passwd.txt                          # 1 列目(名前)だけ
cut -d':' -f1,3 passwd.txt                        # 1 と 3 列目

printf 'sato,30,tokyo\nito,25,osaka\n' > people.csvでカンマ区切りの素材を作成してください。

cutで区切り文字をカンマに指定し、1 列目(名前)だけを抜き出してください。

③ 続けて 1 列目と 3 列目を同時に抜き出し、列の指定の仕方を確認してください。

Linux console
0 / 3 実行済み
Loading Linux Terminal...

行・単語・バイトを数える — wc

wcは入力の行数・単語数・バイト数を数えるコマンドです。オプション無しでは 3 つの数字が並び、wc -lで行数だけ、wc -wで単語数だけ、wc -cでバイト数だけが出ます。いちばん使うのはwc -lで、ls | wc -lのようにパイプで受ければ「ファイルが何個あるか」「該当行が何件か」を数えられます。

書き方意味
wc行数・単語数・バイト数を並べて表示する
wc -l行数だけを表示する
wc -w単語数だけを表示する
wc -cバイト数だけを表示する
wc は 3 つの数を数える
memo.txtgood morning / hellowc -lwc -wwc -c行数 2単語数 3バイト数 19
同じ入力でも、オプションで「何を数えるか」が変わります。
printf 'one two three\nfour\n' > draft.txt   # 2 行・4 単語の素材を作成
wc draft.txt                                  # 行数・単語数・バイト数が並ぶ
wc -l draft.txt                               # 2(行数だけ)
ls | wc -l                                    # パイプで受けてファイル数を数える

printf 'good morning\nhello\n' > memo.txtで 2 行の素材を作成してください。

wc memo.txtを実行し、行数・単語数・バイト数の 3 つの数字が並ぶことを確認してください。

wcに行数だけを出すオプションを付けて、2 が表示されることを確認してください。

④ 次に単語数だけを出すオプションを付けて、3 が表示されることを確認してください。

Linux console
0 / 4 実行済み
Loading Linux Terminal...

文字を変換する — tr

trは標準入力の文字を文字単位で別の文字に置き換えるコマンドです。tr 'a-z' 'A-Z'は小文字を大文字へ変換します。tr -sは連続した同じ文字を 1 つにまとめ(スペースの連続を 1 つにするなど)、tr -dは指定した文字を削除します。trはファイル名を引数に取らず、パイプや入力リダイレクトから受け取ります。

書き方意味
tr 'a-z' 'A-Z'小文字を大文字へ変換する
tr -s ' '連続した文字を 1 つにまとめる
tr -d 'x'指定した文字を削除する
tr は文字単位で変換・圧縮・削除
hellotr 'a-z' 'A-Z'HELLOa b(スペース 3 つ)tr -s ' 'a b(スペース 1 つ)a-b-ctr -d '-'abc
上から順に、変換(小文字→大文字)・連続の圧縮(-s)・削除(-d)です。
echo 'hello linux' | tr 'a-z' 'A-Z'     # HELLO LINUX
echo 'a   b   c' | tr -s ' '            # 連続スペースを 1 つに -> a b c
echo 'a-b-c' | tr -d '-'                # - を削除 -> abc

echo 'desktech learn'の出力をパイプでtrに渡し、小文字を大文字に変換してください。

② 次にecho 'x y z'の出力をtrに渡し、連続したスペースを 1 つにまとめるオプションを使ってください。

echo 'a-b-c'の出力をtrに渡し、ハイフンを削除するオプションでabcにしてください。

Linux console
0 / 3 実行済み
Loading Linux Terminal...

画面とファイルへ分岐する — tee

teeはパイプで受け取った内容を画面に出しつつ、同時にファイルにも書き込みます。途中経過をログに残しながら、後続のコマンドにもそのまま流したいときに使います。コマンド | tee out.txt | 次のコマンドのようにつなぐと、out.txtに記録しながら処理を続けられます。既存のファイルに追記したいときはtee -aを使います。

書き方意味
tee out.txt画面とファイルの両方へ出力する(上書き)
tee -a out.txt画面に出しつつファイルへ追記する
tee は画面とファイルの両方へ流す
echo hi| tee out.txt| 次のコマンド画面に hiout.txt にも hi処理は続くcat out.txthi が残っている
teeは受け取った内容を画面に出しつつファイルにも書き、あとからcatで確認できます。
ls | tee list.txt              # 一覧を画面に出しつつ list.txt へ保存
cat list.txt                   # ファイルにも残っている
echo 'extra' | tee -a list.txt # -a は上書きせず追記

echo 'one two'の出力をパイプでteeに渡してnote.txtに書き込み、画面にも同じ内容が出ることを確認してください。

cat note.txtで、ファイルにも同じ内容が残っていることを確認してください。

③ 次にecho 'three'の出力をteeの追記オプションでnote.txtに追記してください。

④ もう一度cat note.txtを実行し、2 行に増えていることを確認してください。

Linux console
0 / 3 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1uniqが重複として扱うのはどの行ですか?

Q2cut -d',' -f1 users.csvは何を出力しますか?

Q3echo hi | tee out.txtを実行すると何が起きますか?