Linux(Linux Essentials)3‐2.ファイルの表示と加工と検索(正規表現)、リダイレクト

今回紹介するのは以下
・ファイルの内容を表示するコマンド(more,less,cat,head,tail,wc)
・ファイルを加工するコマンド(cut,sort,uniq,grep
grep正規表現の組み合わせ
・リダイレクト演算子(<,<<,>,>>,2>,2>&1,)






■ファイルの内容を表示するコマンド
・more
→ファイルの内容をページ(画面)ごと表示。


・less
→ファイルの内容をページ(画面)ごと表示(※moreの拡張版)。


・moreやlessコマンドのページの操作。
→1ページ進む:スペース
→1ページ戻る:b
→終了:q
→先頭へ戻る:g(lessのみ)
→末尾へ進む:G(lessのみ)


例:ページ単位でファイルの内容を表示するコマンド。
→more
→less


・cat
→ファイルを全て表示。


・head
→ファイルの先頭を表示。


・tail
→ファイルの末尾を表示


・wc
→ファイルの行数、ワード数、バイト数を表示。


例:ファイル「file.txt」の先頭5行だけを表示するコマンド。
→head -n5 file.txt


例:ファイル「file.txt」の行数やワード数、バイト数などを表示する場合「$ _______ file.txt」の空欄に当てはまるコマンド。
→wc





■ファイルを加工するコマンド
・cut
→ファイルまたは標準入力の各行から指定したフィールドを抽出。


例:ファイル「file.txt」の内容から3番目と4番目のフィールドを抽出するコマンド。
→cut -d: -f3,4 file.txt
※タブ以外の文字をデリミタとして使用したい場合は「-d」オプションを使用。


・sort
→行単位でファイルの内容をソート(並び替え)。


例:以下は「fileA.txt」の内容である。

$ cat fileA.txt
AAAA
aaaa
bb
xyzabc
dddd
aaaa

以下のような並び替えの出力を行うコマンド。

$ _______ fileA.txt
AAAA
aaaa
aaaa
bb
dddd
xyzabc

→sort


例:コマンド「sample_cmd」の出力をソートして表示するコマンド。
→sample_cmd | sort


例:ファイル「file.txt」には、スペースで区切られたフィールドが10個存在する。その5番目のフィールドを基準に並べ替えを行うコマンド。
→sort -k5 file.txt
※フィールドを指定して並べ替えを行う場合は「-k」オプションを指定。


・uniq
→連続して重複した行を1行にまとめて表示。


例:以下は「fileA.txt」の内容である。

$ cat fileA.txt
AAAA
aaaa
bb
AAAA
dddd
aaaa

重複した内容をまとめて出力するコマンド。
sort fileA.txt | uniq
※sortで並び替えた後にuniqで重複行をまとめるのが定石。


grep
→パターンにマッチする文字列を含む行を抽出。





grep正規表現の組み合わせ
grep [オプション] 検索パターン [ファイル名]
→マッチした行の行数を表示:-c
→大文字と小文字を区別しない:-i
→マッチしなかった行を表示:-v
拡張正規表現を表示:-E


例:ログファイル「/var/log/messages」へ出力されたログメッセージから「SampleApp」のログをすべて抽出するコマンド。
(ただしログには「sampleapp」「SAMPLEAPP」など大文字と小文字が混ぜて出力されている)。
grep -i "SampleApp" /var/log/messages


例:grepコマンドで正規表現「?」を使用して検索したい場合に指定するオプション。
→-E





・任意の一文字:.
→「a..」はaから始まる3文字(aaaやabc)。


例:ファイル「file.txt」からgrepコマンドを用いて「a」から始まるアルファベット3文字以上の単語のある行を抽出するコマンド。
grep 'a..' file.txt
※検索対象をシングルクォーテーションの「''」で囲む。


・直前の文字の0回以上の繰り返し:*
→「.*」は任意の文字列。


例:以下の文字列から正規表現「g.*e」にマッチする文字列はどれか。

dragon fruit
mango
grape
melon
orange

grape
→orange
※「g<0文字以上の任意の文字または文字列>e」がある文字列


・直前の文字の0回または1回の繰り返し:?
→「abc?」は「ab」または「abc


例:ファイル「file.txt」から文字列「cat」または「cats」を含む行を抽出する正規表現
→cats?
※文字「?」は、直前の文字の0回または1回の繰り返しを意味する。


・カッコ内のいずれか1文字:[]
→[abc]はa,b,cのいずれか1文字。


・カッコ内で範囲を指定:[-]
→[a-z]は小文字のアルファベットの1文字。


・カッコ内で先頭にある場合は後続の文字以外:[^]
→[^abc]はa,b,c以外のどれか1文字。


例:正規表現で、abcdeのいずれか1文字を表すもの。
→[abcde]
→[a-e]


・行頭:^
→「^a」はaから始まる行。
※カッコ指定で[^a]の場合はa以外(真逆の意味)になるので注意


・行末:$
→「a$」はaで終わる行。


例:grepコマンドでファイル「file.txt」に空行を除いた行が何行あるか数えるコマンド。
grep -cv '^$' file.txt
※空行は、ファイルの先頭「^」と末尾「$」に何も文字がないことから「^$」により表現。


例:ファイル「file.txt」から、行の先頭が「#」で始まる行を抽出する正規表現
^#
※「^#*」の場合は「*」は0文字以上を表すため、「#」が含まれていない行も抽出。


例:ファイル「file.txt」から、空行(何も入力されていない行)でない行を抽出する場合「$ grep -v '____' file.txt」の空欄に当てはまる正規表現
^$
※ファイルの先頭「^」と末尾「$」に何も文字がないことから「^$」は空行を意味する。


・次の1文字をエスケープ文字:\
→「\*」は"*"という文字を表す。


例:ファイル「file.txt」から、文字「$」のある行を抽出するコマンド。
grep '\$' file.txt
※文字「$」は正規表現ですが、文字として扱いたい場合は「\」を使用。





■リダイレクト演算子
・標準入力へ送る:<


例:ファイル「file.txt」から文字列「Linux Essentials」に該当する行を抽出する場合「$ grep "Linux Essentials" ___ file.txt」の下線部に当てはまるもの。

(何も入力しない)


終了文字まで標準入力へ送る:<<


・標準出力をファイルへ送る:>


例:コマンド「sample_cmd」は標準出力と標準エラー出力へメッセージを出力するコマンドで、標準出力へ出力する内容だけをファイル「sample.txt」へ出力したい場合のコマンド。
→sample_cmd > sample.txt


・標準出力をファイルへ追記:>>


例:既存のファイル「file.txt」へls -lコマンドの実行結果を出力したい。ただし既に書かれている内容は消さずに追記するコマンド。
→ls -l >> file.txt


・標準エラー出力の出力先を指定:2>


例:コマンド「sample_cmd」は標準出力と標準エラー出力へメッセージを出力するコマンドで、標準エラー出力へ出力するメッセージだけをファイル「error.txt」へ出力したい。ただし既にファイルが存在する場合は上書きする。
→sample_cmd 2> error.txt


標準エラー出力の出力先を、標準出力の出力先と一緒にする:2>&1


例:「ls fileA fileB」とした場合、実行結果とエラーメッセージをファイル「ls.txt」へ出力するコマンド。
→ls fileA fileB > ls.txt 2>&1