テキスト処理
テキスト処理は、コマンド単体の意味と、パイプでつないだときの結果予測の2方向から問われます。
頻出は uniq です。uniq は隣り合った行しか比べません。並べ替えずに uniq -c をかけると、離れた場所にある同じ行は別々に数えられます。全体の重複をまとめたいなら、必ず先に sort を通す必要があります。もう1つは cut の区切り指定で、-d を省くとタブが区切りとみなされます。CSV のつもりで -d を書き忘れ、1行まるごとが出てきて戸惑うのは定番の失敗です。
フィールドを切り出す
| コマンド | 用途 |
|---|---|
cut -d : -f 1 | コロン区切りの1列目を取り出す |
cut -c 1-5 | 各行の1文字目から5文字目を取り出す |
cut -d : -f 1,3 | 1列目と3列目を取り出す |
paste a b | 2つのファイルを行単位で横に連結する |
paste -d , a b | 連結時の区切り文字をカンマにする |
cut は列を縦に切り出し、paste は横に貼り合わせます。-f は 2-4 や 3- のように範囲でも書けます。
ターミナル
cut -d : -f 1,7 /etc/passwd並べ替えと重複処理
| コマンド | 用途 |
|---|---|
sort | 辞書順に並べる |
sort -n | 数値として並べる |
sort -r | 逆順に並べる |
sort -k 2 | 2番目のフィールドをキーに並べる |
sort -t : -k 3 -n | コロン区切りの3列目を数値として並べる |
sort -u | 並べた上で重複を1つにまとめる |
uniq | 隣り合う重複行を1つにする |
uniq -c | 重複行の件数を先頭に付ける |
uniq -d | 重複した行だけを出す |
uniq -u | 1回しか現れない行だけを出す |
辞書順のまま数値を並べると、10 が 2 より前に来ます。数値の集計では -n を忘れないでください。sort -u と sort | uniq はほぼ同じ結果ですが、件数を数えるには uniq -c が要ります。
文字単位の置換と削除
tr は標準入力からしか読みません。ファイル名を引数に取らない点が試験で問われます。
ターミナル
tr 'a-z' 'A-Z' < input.txt
tr -d '\r' < input.txt
echo "aabbcc" | tr -s 'a-z'-d は指定した文字集合を削除し、-s は連続する同じ文字を1つに縮めます。文字集合は a-z のような範囲や、[:digit:] [:alpha:] [:space:] のようなクラスで書けます。
行数と抜き出し
| コマンド | 用途 |
|---|---|
wc -l | 行数 |
wc -w | 単語数 |
wc -c | バイト数 |
head -n 5 | 先頭5行 |
tail -n 5 | 末尾5行 |
tail -n +5 | 5行目から最後まで |
tail -f | 追記を待ち受けて表示し続ける |
nl | 行番号を付ける |
split -l 100 file pre | 100行ずつに分割する |
od -c | バイト列を文字として8進ダンプで表示する |
tail -n 5 と tail -n +5 は意味が違います。前者は末尾5行、後者は5行目から最後までです。tail -f はログ監視の定番で、ファイルが伸びるたびに追加分を表示します。nl が空行に番号を振らないことは cat -n との違いとして問われます。od は改行やタブなど目に見えない文字を確かめるときに使います。
よくある引っかけ
uniq だけで全体の重複を消せる、という選択肢は誤りです。先に sort を通す必要があります。
tr がファイル名を引数に取れる、という選択肢も誤りです。リダイレクトかパイプで渡します。
cut -d を省略したときの既定の区切りはスペースではなくタブです。ここも選択肢として並びます。