ここでは主にファイルやテキストをコマンドを使って思い通りに表示させたり、検索したりといった方法を解説していきます。
Linuxコマンドは種類が非常に多いですが、うまく利用すれば作業の大幅短縮が見込めます。
ソートなども可能ですので、ぜひ覚えていきましょう。
ファイル内容をソートする「sort」
ファイルに記述された内容をソートするには「sort」コマンドを利用します。
コマンドの書式
sort[オプション][ファイル1 ファイル2...]
コマンドの主なオプション
- -f(--ignore-case):並び替え時に大文字/小文字を区別しない
- -V(--version-sort):バージョンを数字順で並べ替える
- -n(--numeric-sort):文字列を数値と見なして並べ替える
- -h(--human-numeric-sort):人が読むことのできる形式の数値で並べ替える
- -g(--general-numeric-sort):一般的な数値として並べ替える
- -M(--month-sort):月名で並べ替える
- -b(--ignore-leading-blank):先頭の空白を無視して並べ替える
- -i(--ignore-nonprinting):表示可能な文字だけを対象に並べ替える
- -r(--reverse):逆順で並べ替える
カレントディレクトリに下記の数字が記述された「test01.txt」が作成されているとします。
test01.txt
1
5
75
50
10
この内容を、ソートしてみましょう。
$ sort test01.txt
$ sort -n test01.txt
$ sort -r test01.txt
$ sort -nr test01.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
[root@CentOS7 ~]# cat << EOF > test01.txt 👈 書き込み 1 5 75 50 10 EOF ---------------------------------------------------------------------- [root@CentOS7 ~]# sort test01.txt 👈 オプションなしだとデフォルトで昇順ソート 1 10 5 50 75 ---------------------------------------------------------------------- [root@CentOS7 ~]# sort -n test01.txt 👈 数値として並べ替え 1 5 10 50 75 ---------------------------------------------------------------------- [root@CentOS7 ~]# sort -r test01.txt 👈 降順で並べ替え 75 50 5 10 1 ---------------------------------------------------------------------- [root@CentOS7 ~]# sort -nr test01.txt 👈 オプションを組み合わせ 75 50 10 5 1 |
「sort」コマンドは、ファイル内容を文字列として認識している為「10」と「5」では「10」のほうが先に表示されます。
「5」と「10」を比較した場合、「sort」コマンドは、一見「数値」に見える値を「文字列」として判断します。「10」の1文字目を取って「1」と認識し、その結果「5」と「1」では「1」の方がい小さいと判断するのです。
オプション(-nr等)を組み合わせれば「数値」として「降順」ソートも可能となります。
※ コマンドオプションを付与することで、降順ソートで表示させたり数値としてソートさせることが可能になります。
ファイル内の重複行を削除する「uniq」
ファイルに記述された内容から重複した行を削除するには、「uniq」コマンドを使用します。
コマンドの書式
uniq[オプション]入力ファイル[出力ファイル]
コマンドの主なオプション
- -c(--count):各行の前に出現回数を出力する
- -u(--unique):重複していない行だけを出力する
- -d(--repeated):重複した行だけを出力する
- -D(--all-repeated):重複する行を全て出力する
- -i(--ignore-case):比較時に大文字と小文字の違いを無視する
カレントディレクトリに昇順ソートされた「test02.txt」が作成されているとします。
※ uniqコマンドは隣り合った行しか比較しないため、予めsortコマンドでソートしておくことが前提となります。
test02.txt
1111
1234
1234
5678
ここから、重複行を削除してみましょう。
$ uniq test02.txt
$ uniq -c test02.txt
$ uniq -d test02.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[root@CentOS7 ~]# cat << EOF > test02.txt 👈 書き込み 1111 1234 1234 5678 EOF ---------------------------------------------------------------------- [root@CentOS7 ~]# uniq test02.txt 👈 重複していた「1234」が削除 1111 1234 5678 ---------------------------------------------------------------------- [root@CentOS7 ~]# uniq -c test02.txt 👈 重複した行数を表示 1 1111 2 1234 1 5678 ---------------------------------------------------------------------- [root@CentOS7 ~]# uniq -d test02.txt 👈 重複した内容のみ表示 1234 |
重複していた「1234」が削除され、一つにまとまりました。オプションのなかには、重複した行数を表示したり、重複した内容のみを表示させたりする機能もあります。
文字を置換する「tr」
ファイルに記述された内容をある文字へ置換するには、「tr」コマンドを使用します。
コマンドの書式[
tr[オプション]文字列1[文字列2]
コマンドの主なオプション
- -d(--delete):[文字列1]に含まれる文字があったら削除する
- -s(--squeeze-repeats):[文字列1]に含まれる文字が連続していたらまとめる
- -t(--truncate-set1):[文字列1]を[文字列2]の長さに切り詰めて処理を行う
- -c(--complement):[文字列1]に含まれない文字全てを対象とする
カレントディレクトリに「test03.txt」が作成されているとします。
test03.txt
AAABBBCCDD
ここから、「A」を「Z」に置換してみます。
$ tr A Z < test03.txt
$ tr -d B < test03.txt
1 2 3 4 5 6 7 8 9 |
[root@CentOS7 ~]# cat << EOF > test03.txt 👈 書き込み AAABBBCCDD EOF ---------------------------------------------------------------------- [root@CentOS7 ~]# tr A Z < test03.txt 👈 「A」を「Z」に置換 ZZZBBBCCDD ---------------------------------------------------------------------- [root@CentOS7 ~]# tr -d B < test03.txt 👈 指定した文字列を削除 AAACCDD |
特定の文字列を削除したい場合は、「-d」オプションを付与することで可能となります。
文字列を検索する「grep」
ファイルの記述のなかにある特定の文字列が含まれているかどうかを判別し、抽出するには「grep」コマンドを使用します。
コマンドの書式[
grep[オプション] 検索パターン ファイル
コマンドの主なオプション
- -e(--regexp):検索パターンを指定する
- -G(--basic-regexp):検索に基本正規表現を使う
- -E (--extended-regexp):検索に拡張正規表現を使う
- -P (--perl-regexp):検索にPerl正規表現を使う
- -f (--file):ファイルに書かれているパターンを検索する
- -i (--ignore-case):大文字と小文字を区別しない
- -w (--word-regexp):単語全体でパターンと一致するものを検索する
- -x (--line-regexp):行全体がパターンと一致するものを検索する
- -v (--invert-match):パターンに一致しない行を表示する
- -s (--no-messages):エラーメッセージを表示しない
- -q(--quiet):結果を表示しない
- -L(--files-without-match):一致するものが含まれていないファイル名のみ表示
- -I(--files-with-matches):一致するものが含まれているファイル名のみ表示
- -c(--count):一致するものが含まれている回数のみ表示
- -n(--line-number):行番号を併せて表示する
- -H(--with-filename):ファイル名を併せて表示する
- -h(--no-filename):ファイル名を表示しない
workディレクトリのなかに「test04.txt」と「test05.txt」の2ファイルがあるとします。
/work/test04.txt
Orange
/work/test05.txt
Grape
workディレクトリの中から、「ra」という文字列が含まれているファイルを抽出するには、下記のようにコマンドを実行します。
※「work/*」は、work配下のファイルをすべて対象として検索を実行します。
$ grep ra work/*
$ grep -i g work/*
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@CentOS7 ~]# cat << EOF > work/test04.txt 👈 書き込み Orange Orange EOF ---------------------------------------------------------------------- [root@CentOS7 ~]# cat << EOF > work/test05.txt 👈 書き込み Grape Grape EOF ---------------------------------------------------------------------- [root@CentOS7 ~]# grep ra work/* 👈 「ra」という文字列が含まれているファイルを抽出 work/test04.txt:Orange work/test05.txt:Grape ---------------------------------------------------------------------- [root@CentOS7 ~]# grep -i g work/* 👈 小文字を区別せずに検索 work/test04.txt:Orange work/test05.txt:Grape |
ちょっと分かりずらい為、実機で実行したイメージを下記に張り付けておきます。
※ 最近のLinuxでは、該当箇所を強調表示してくれます!
テキストをページ単位で表示する「more , less」
ファイルの内容をページ単位で表示するには、moreコマンド、もしくはlessコマンドを用います。moreとlessはほぼ同じ機能ですが、moreは末尾まで参照すると自動的にプロンプトへ戻るのがlessとの違いです。
しかしながら、両者とも使用頻度はそれほど高くはありません。何故なら、通常、ファイルの中身を参照する場合は「cat」コマンドを使うことが一般的だからです。複数ページにわたる長文以外は、「cat」コマンドで事足りてしまうことが多いのです。
一応、知識として頭の片隅に置いておく程度で良いと思います。
コマンドの書式[
more[オプション]ファイル名
less [オプション] ファイル名
moreコマンドの主なオプション
- +数値:数値で指定した行から表示する
- +/文字列:指定した文字列を検索して、見つけた行の2行上から表示する
- -s:連続した空行を1行にする
- -l:改ページを無視する
- -u:下線の処理を行わない
- -数値:画面の行数を指定する
- -f:画面での行数ではなく、データの行数を表示する
- -d:無効なキーが入力された場合に、ヘルプを表示する
lessコマンドの主なオプション
- +行数,-行数:指定した行から表示する
- +/文字列:指定文字列を検索し、見つけた行から表示する(正規表現可)
- -p文字列(--pattern):指定文字列を検索し、見つけた行から表示する(正規表現可)
類似コマンドとしてはcatコマンド、vimコマンドなどがありますが、それぞれ用途で使い分けると良いでしょう。
「cat」:一気に最後まで表示させます。ファイルを機械的に連結させる、コマンドライン引数にファイルの中身を機械的に渡す等の時に使います。
「vim」:ファイル編集をするときに使用します。参照するだけなら、「cat」コマンドを使用しましょう。
まとめ
この記事では、テキストの内容を処理するLinuxコマンドについて解説しました。
Linuxでのテキスト処理は、WindowsやMACの様に「マウス」を使った編集は行いません。黒い画面へひたすらコマンドを打ち込んで操作していきます。
ちょっとした抵抗感を感じるかもしれませんが、この操作に慣れることで動的にテキストを編集することが出来るようになります。エクセルに張り付けて並び替え等の作業が、コンソール上で一発で出来てしまうのです。
もうWindowsやMACのテキストエディタでは物足りなくなり戻れません。