【UNIX/Linux】grepでパイプを応用的に使う

こんにちは。関東の大学に通う大学生ミンチ(@programminchi)です。今回は、以前お話した、パイプを使う際によく出てくるコマンドを覚えていきましょう。

 

以前の内容をまだ見ていない人はこちらから確認してみてください。UNIXのリダイレクトとパイプについての説明をしています。

【UNIX/Linux】リダイレクトとパイプについて理解しよう

 

スポンサーリンク

よく使うコマンド(パイプ使用時)

パイプの機能を使うと、色々な作業を効率的に行うことができますが、この時によく出てくるコマンドがあります。

 

grepコマンド

grepコマンドを使うと、ファイルからマッチするパターンを簡単に見つけ出してくることができます。

 

$grep (-オプション) パターン file

上のパターンの部分で自分が見つけ出したい文字列のパターンを入力します。後に学びますが、正規表現などを使うことによって、パターンを詳細に指定することができます。

 

また、grepコマンドではオプションも頻繁に使うので、以下にオプションをまとめておきます。

n...行番号を表示する。
i...英大文字と英小文字を区別しない。
v...パターンとマッチしない行を検索する。

以下にいくつか例を挙げていきます。まずはファイルfruitsを作り、ファイルの中身を以下のようにします。

 

Apple
Melon
Grape
Cherry

 

$grep -i a fruits
Apple
Grape

上のようにコマンドを実行すると、出力ではAppleとGrapeが出てきます。

これはパターンでaを指定したので、aが入っているフルーツが出力として得られたということです。

iオプションを使うことによって、大文字のAを含んでいるAppleもしっかり検索に引っかかってくれます。

 

もう1つ例を見ていきましょう。

$grep -v Apple fruits
Melon
Grape
Cherry

上のようにコマンドを実行すると、出力ではMelonとGrapeとCherryが出てきます。

これはパターンでAppleを指定しており、かつパターンとマッチしないものを探すvオプションを使っているのでApple以外が出力されます。

 

スポンサーリンク

sortコマンド

sortコマンドを使うと、ファイル内の行を並べ替えることができます。

 

$sort (-オプション) (-k フィールド) file

上のkの後に並べ替えたいフィールドを指定することでそのフィールドについて行が並べ替えられます。

 

また、sortコマンドでもオプションが頻繁に使われるので以下でいくつか紹介します。

r...降順に並び替える
f...英大文字と英小文字を区別しない
n...数値順に並び替える

では、上で使ったファイルfruitsを以下のように書き換えます。フルーツの横の数字はそれぞれの値段です。

 

Apple 100
Melon 1000
Grape 500
Cherry 600

 

$sort fruits
Apple 100
Cherry 600
Grape 500
Melon 1000

上のようにコマンドを実行すると、ファイルfruitsのフルーツがソートされます。アルファベット順になっているのが分かると思います。

 

 

別の例を見てみましょう。

$sort -n -k 2 fruits
Apple 100
Grape 500
Cherry 600
Melon 1000

これはkオプションでフィールドを2に指定しているのでフルーツではなく、値段についてソートされます。

また、数値中にソートしたいのでnオプションを使っています。

 

 

最後にもう1つ見ていきましょう。

$sort -nr -k 2 fruits
Melon 1000
Cherry 600
Grape 500
Apple 100

これは上のとあまり変わりませんが、rコマンドを使って降順にソートされるように指定しているので、結果的には全て反対になっています。

 

headコマンド

headコマンドを使うと、ファイルの最初から数行が表示されます。

 

$head (-n 行数) file

nオプションの後に数字を指定してあげると、その数字分の行数を表示します。また、nオプションを指定しない場合は、ファイルの最初から10行が表示されます。

 

さらに、tailコマンドというものがあって、ファイルの最後の数行を表示してくれます。使い方は完全にheadコマンドと同じです。

 

 

スポンサーリンク

wcコマンド

wcコマンドはファイルのバイト数と単語数と行数を表示します。

 

$wc (-cwl) file

オプションを指定しない場合は全部表示されます。しかし、オプションを使うことで表示させたい情報だけ表示させることができます。

オプションのcとwとlはそれぞれバイト数、単語数、行数を表します。

 

 

 パイプを応用しよう

上で学んだコマンドなどを、パイプでつなぎ合わせて、ちょっと複雑な処理をやってみましょう。3つくらい例を挙げて具体的に見ていきます。

 

もう一度上で見たファイルfruitsを下に表示しておきます。

Apple 100
Melon 1000
Grape 500
Cherry 600

 

 

$grep -i a fruits | wc -l
2

これは簡単です。grepコマンドで大文字小文字指定せずにaにマッチする行を探すとAppleとGrapeがマッチします。

そしてwcコマンドをlオプション付きで実行すると、2と出力されるので、行数が2であったことが分かります。

 

 

次の例を見ていきましょう。

$sort fruits | grep -v Melon | head -n 2
Apple 100
Cherry 600

まず、sortコマンドでフルーツがアルファベット順にソートされます。その後に、grepコマンドによってMelonを除く行が選ばれます。

最後にheadコマンドによって最初の2行が出力されます。

 

 

最後にもう1つだけ例を見ておきましょう。

$sort -n -k 2 fruits | grep -iv g | tail -n 2

これはまず、sortコマンドのkオプションで値段が指定されており、nオプションもついているので値段順にソートされます。

その後grepコマンドを見ると、vオプションでgが指定されているので、gにマッチするGrapeの行が除かれます。(iオプションがあるので大文字小文字は区別されない)

最後に、tailコマンドによって最後の2行が出力されます。

 

 

 

 まとめ

今回はパイプのより応用した使い方について説明していきました。

grepコマンドのパターンを指定する部分で、もっと色々な指定の仕方がしたいと思った方もいると思いますが、それは今後学ぶ、正規表現について理解すると、様々な指定ができることが分かると思います。

今のところは今回挙げたような簡単な例をすらすら書けるように理解しておいてください。

 

 

今後も定期的にコンピュータ系の記事を発信していくので是非、興味のある人はツイッターの方もフォローお願いします!!

スポンサーリンク