(教材)03【フィルタコマンドの使い方】
フィルタとは?
一般的にはフィルタとは,与えられたものの特定成分を取り除いたり,弱めたりする機能を持つものをいう.
(コーヒーのフィルタ,レンズのフィルタ,電気回路のフィルタ,ディジタルフィルタなど)
Unixでは,標準入力で受けた入力データを加工して標準出力に出力するプログラム(コマンド)をフィルタと呼ぶ.ここでは,Unixの代表的なフィルタコマンドとして次のものを取り上げる.
table:フィルタコマンドと機能
コマンド 機能
grep 入力データの中で指定された文字列を探す
sort 入力データの行を並べ換える
head 入力データの先頭から指定された数の行を出力する
tail 入力データの末尾から指定された数の行を出力する
ファイルの準備
フィルタを使う前に,まず以下のような文字データを含んだ作業ファイルを作っておこう.
ファイル名は testdataとし,Workディレクトリにcdして作業すること.
code:▼はEnter,■はプロンプト
$ cat > testdata▼
BASIC
LISP
Pascal
C
ALGOL
APL
FORTH
COBOL
Ada
FORTRAN
$ ■
★ファイルの作成方法はエディタでもcat コマンドでも構わない.
※ただし,Windows/MacOSのGUIエディタは使わないこと (教育上の理由とフォルダ/ディレクトリの混乱防止) .
・cat コマンドを使ったやり方は教科書 8-2-1節 ( p.123 ) 「catコマンドで作る」参照.
grep コマンド
ファイルが準備できたら,grep コマンドを使ってみよう.grep コマンドは,指定された文字列の検索を行うフィルタであり,次のような書式で使用する.
grep 文字列 ファイル名▼
Unixのコマンドでは,文字列は「'」(シングルクォーテーション)で囲むのが一般的だが,文字列の間に空白や特殊記号を含まない場合などには省略することができる (以下では省略する) .
では,実際に次のように入力してみよう ($はプロンプト記号) .
$ grep FORT testdata▼
このようにコマンドを入力すると,testdataの中から「FORT」という文字列を含む行を検索して画面に表示する.
code:▼はEnter,■はプロンプト
$ grep FORT testdata▼
FORTH
FORTRAN
$ ■
なお,grep コマンドでは,文字列の小文字と大文字は区別される.
※大文字小文字を同一視したいなら「-i」オプションを指定する(「i」は "ignore" の "i").
次の2つの場合,どのような出力となるか予想してから,実際に試してみよう(「-i」オプションも試してみよう).
$ grep a testdata▼
$ grep A testdata▼
$ grep -i a testdata▼
$ grep -i A testdata▼
sort コマンド
sort コマンドは並べ換え(ソート)を行うコマンドである.次のような書式で使用する.
$ sort ファイル名▼
このsort コマンドを使ってみよう.次のように入力すると,ファイルから読んだ行を,辞書の項目と同じ順に並べ換えたものを出力する.
$ sort testdata▼
code:▼はEnter,■はプロンプト
$ sort testdata▼
ALGOL
APL
Ada
BASIC
C
COBOL
FORTH
FORTRAN
LISP
Pascal
$ ■
※注意※
sort コマンドは行を辞書式順序(辞書の項目と同じ順序)に並べ換える.各文字の順番はUnixの内部表現(整数値)によって決まる.上の例で,APLがAdaより先なのは,大文字(A-Z)の方が小文字(a-z)よりも小さい内部表現を持っているからである.
今度は「-r」オプションを指定して使ってみよう.次のようにすると,sort コマンドは逆順に並べ換えて出力する.
$ sort -r testdata▼
code:▼はEnter,■はプロンプト
$ sort -r testdata▼
Pascal
LISP
FORTRAN
FORTH
COBOL
C
BASIC
Ada
APL
ALGOL
$ ■
head コマンド
head コマンドは,ファイルの最初の部分を表示する.
head -n 数字 ファイル名▼
こうすると,指定された数の行だけファイルの先頭の行が表示される.例えば,以下のように入力してみよう.
$ head -n 2 testdata▼
すると,以下のように表示される.
code:▼はEnter,■はプロンプト
$ head -n 2 testdata▼
BASIC
LISP
$ ■
この時,もし「-n 数字」を省略して,
$ head ファイル名▼
とすると,10行程度の行が出力される(行数はシステムの設定による).
ファイル名を複数指定することも可能(半角空白で区切ってファイル名を並べて指定する).
その場合,それぞれのファイルの先頭から指定された行数だけ表示される.
tail コマンド
tail コマンドは,ファイルの最後の部分を表示する.
tail -n 数字 ファイル名▼
とすると,指定された数の行だけファイルの末尾の行が表示される.例えば,
$ tail -n 2 testdata▼
とすると,以下のように出力される.
code:▼はEnter,■はプロンプト
$ tail -n 2 testdata▼
Ada
FORTRAN
$ ■
tail コマンドは,最後の行を表示すること以外は,head コマンドとほとんど同じである.「- n 数字」を省略した場合も同様.
標準入力から読む
フィルタは,引数として指定されたファイルからデータを読み込むが,それとは別に,標準入力からデータを読むことができるように作られている.これまでに説明したフィルタも例外ではない.
つまり,ファイルと同じ内容を標準入力(キーボード)から入力しても構わない.
grep コマンドでは,指定された文字列がある行にヒットしたら,すぐにその行を出力する.次のように入力して確認してみよう.
code:▼はEnter,■はプロンプト
$ grep FORT▼
LISP▼
FORTH▼
FORTH ←この行はgrepが出力した
BASIC▼
FORTRAN▼
FORTRAN ←この行はgrepが出力した
[エンターキーの後でCtrl+D]
$ ■
※つまり標準入力から入力したLISPからBASICのうち,指定したFORTにヒットした行だけ表示する.
標準入力が使用できるということは,リダイレクト記号「<」を使って,ファイルの内容を grep コマンドに入力することもできるということである.
つまり,ファイルを引数とする方法
$ grep FORT testdata▼
の替わりに,ファイルの内容をリダイレクトで読み込む方法
$ grep FORT < testdata▼
としてもまったく同じ結果になる.
code:▼はEnter,■はプロンプトを
$ grep FORT < testdata▼
FORTH
FORTRAN
$
他のフィルタコマンドも同様で
$ コマンド ファイル名▼
という書式のものは
$ コマンド < ファイル名▼
としても同じ結果が得られる.sort , head , tail などのコマンドでも試してみよう.
実は,フィルタに限らず,ファイルを引数とするコマンドのほとんどは,標準入力からデータを読めるように作られている.たとえば,
$ cat testdata▼
でも
$ cat < testdata▼
でも出力結果は同じである.
フィルタをパイプでつなげる
フィルタコマンドはその出力は,デフォルトでは標準出力である.ということは,フィルタコマンドの結果をパイプでつなげば複数のフィルタコマンドを連続で使うことができるということである.たとえば,
$ sort testdata | head -n 5▼
というコマンドは,sort testdata の出力が,head -5 の標準入力と「パイプ」され,その結果が標準出力に吐き出される(=画面に表示される).どのような結果になるかは,実際に試してみよう.
コマンドの順序が異なれば,一般的には結果も異なる.上の例の順番を変えてみる.
$ head -n 5 testdata | sort▼
これは,どのような出力となるか予想してから,実際に試してみよう.
また,当然のことながら,パイプはいくつでもつなぐことができる.
$ grep -i a testdata | head -n5 |tail -n 3 |sort -f▼
これはどのような出力となるか予想して (オプションはmanで調べて) から,実際に試してみよう.
※いきなり全部試すより,パイプでつながれた処理をひとつずつ順に追加して実行していくとわかりやすい.
その他のフィルタコマンド
Unixには,ここで紹介したフィルタ以外にも,tee , cut , uniq , wc などのような比較的シンプルなコマンドや,sed や awk のような高機能なプログラムもある.これらについても,manやインターネットで使い方を調べてみよう.
以下,主要なフィルタコマンドを紹介しておく.
table:その他のフィルタコマンド
コマンド 機能
tee T字路のように出力先を分岐する
cut 文字列の部分だけを切り出す
uniq 同じ内容の行を探し出す
wc 語数カウンタ
indent プログラムソースを整形する
nkf 日本語コードを変換する
sed 置換や削除など編集作業を標準入出力で行う
awk パターン処理言語
※追記※
head コマンドと tail コマンドでは「-数字」というオプションも可能.たとえば,
$ head -2 testdata▼
$ tail -2 testdata▼
これらは同じ結果が得られる.このオプションは現在では推奨されていないようだが,こうした使用例も見かけることがあるので覚えておくとよいだろう.
【まとめ】
まとめてして,以下に sort , head , tail , grep の主要なオプション表を提示しておく.
https://gyazo.com/6d98e7d57688b9bc0f885bf420c547a6 https://gyazo.com/8c02a2a089e1fdf7fca5b791ed24bd48
<head のオプション> <tail のオプション>
https://gyazo.com/1d3271572abb5ffecc6950f02672b5c6 https://gyazo.com/84b542cd73f58153081d334b06973f97
<sort のオプション> <grep のオプション>
以上.
2023/6/28 by Kobori Satoshi, Fujii Daisuke