はじめに
grep
コマンドは、ある特定の文字列を含むものを取り出す・検索するときに使用します。
大別して、ファイル内のテキストに対してgrepを行うか、ファイル名に対してgrepを行うかでやり方が変わってきます。
やってることは単純だが、いろいろと応用できるので、今回まとめてみました。
練習用のファイルのダウンロード
練習用のファイル・フォルダを以下のコマンドでダウンロードできるようにしています。
#ダウンロード svn export https://github.com/kumeS/Blog/trunk/grep_practice #作業フォルダに移動 cd ./grep_practice
ファイル内のテキストに対する処理
ある特定の文字列を含む行を表示する
#ファイル内の表示 cat test_01.txt #'abc'を含む行を出力する grep 'abc' test_01.txt #OR grep "abc" test_01.txt #OR cat test_01.txt | grep 'abc'
ある特定の文字列を含まない行を表示する
#'abc'を含まない行を出力する grep -v 'abc' test_01.txt #OR cat test_01.txt | grep -v "abc"
ある特定の文字列を含まない行を別ファイルに出力する
#'abc'を含まない行を「test_01_v.txt」として保存する grep -v 'abc' test_01.txt > test_01_v.txt #test_01_v.txtの表示 cat test_01_v.txt
オプション
-v
: 文字列を含まない、あるいは、一致しないものを検索する
空白行を削除する
#空白行を含まない行の表示 cat test_02.txt | grep -v '^\s*$' #別ファイルで保存する場合 cat test_02.txt | grep -v '^\s*$' > test_02_r.txt
オプション
^
: 行頭
\s
: 空白文字
^\s*
: 行頭から0回以上繰り返しの空白
ファイル内の行数をカウントする
#ファイル内全体の行数のカウント cat test_01.txt | grep '' -c #grepを使わない方法 cat test_01.txt | wc -l #'abc'を含む行数のみのカウント cat test_01.txt | grep 'abc' -c
オプション
-c
: 行数とかのカウント
複数条件で、文字列の検索をする場合
grepでのAND検索
cat test_02.txt #AND検索 #'AAA'と'ABB'を同行に含む行の表示 grep 'AAA' test_02.txt | grep 'ABB'
grepでのOR検索
cat test_02.txt #OR検索(-e表記) #'AAA'あるいは'BBB'を含む行の表示 grep -e 'AAA' -e 'BBB' test_02.txt #OR検索(正規表現、\| を使う) #'AAA'あるいは'BBB'を含む行の表示 grep 'AAA\|BBB' test_02.txt
オプション
-e
: 検索パターンを指定する
-w
: 単語全体でパターンと一致するものを検索する
-x
: 行全体がパターンと一致するものを検索する
-i
: 大文字と小文字を区別しない
-n
: 検索結果に行番号を表示する
ファイル名に対する処理
ある特定の文字列をファイル名に含むファイルを検索する
#ディレクトリ内ファイルの表示 ls #.txtファイルのみを表示する ls | grep '.txt' #.txtファイルのカウント ls | grep '.txt' | wc -l #ファイル内の行、ワード、バイトの各カウントの表示 ls | grep 'test_01.txt' | wc #OR wc test_01.txt
オプション
-l
: ファイル名を検索対象とする
サブディレクトリも含めて検索する
#'.pdf'を含むファイル数のカウント ls | grep '.pdf' | wc -l #サブディレクトリを含めたファイル表示 du -a #サブディレクトリを含めて、'.pdf'を含むファイルの表示 du -a | grep '.pdf' #サブディレクトリを含めて、ファイル数のカウント du -a | grep '.pdf' | wc -l
特定のファイルを検索して、消去する
#ディレクトリ内の'.pdf'を含むファイルを消去する ls | grep '.pdf' | xargs rm -rf #サブディレクトリも含めて削除する場合 du -a | grep '.pdf' | xargs rm -rf
ここで、 xargs
は、前のコマンドの実行結果を引数にして、次のコマンド rm
に渡すことを意味します。
補足
ターミナル・ショートカット
カーソルの移動 | |
---|---|
Ctrl + b | 後退・一語後退 |
Ctrl + f | 前進・一語前進 |
Ctrl + a | 行頭へ移動 |
Ctrl + e | 行末へ移動 |
削除 | |
Ctrl + w | 単語1個文削除 |
Ctrl + k | 行末まで削除 |
Ctrl + u | 行頭まで削除 |
Ctrl + d | カーソル上の1文字削除 |
Ctrl + h | カーソルの後方を1文字削除 |
履歴 | |
↑ | 一つ前のコマンド履歴 |
↓ | 次のコマンド履歴 |
history (コマンド) | 履歴 |
その他 | |
Ctrl + c | 実行中のコマンドを強制終了 |
Ctrl + z | 実行中のコマンドを一時停止 |
Ctrl + d | 終了、Logout |
Ctrl + l | 画面をクリアする |
Ctrl + t | 一つ前とカーソルの文字の入替 |
Ctrl + m, Ctrl + j, Ctrl + o | Enter |
cd : ディレクトリ移動
cat : ファイル内表示・結合・作成
#テキストファイル(test.txt)内の表示 cat test.txt #行番号を付加して、ファイル表示 cat -n test.txt #複数ファイルから、結合ファイルを作成(行方向に結合) cat test1.txt test2.txt > test3.txt #空ファイルの作成(Ctrl + d で終了すること) cat > test4.txt #すべての履歴表示、「~ (チルダ)」はHomeディレクトリ cat ~/.bash_history #OR history
head / tail : ファイルの先頭や末尾を表示
#ファイルの先頭から、10行を表示 head -n 10 test.txt #ファイルの末尾から、10行を表示 tail -n 10 test.txt
覚えておくと良いターミナルコマンド
#システムを終了する shutdown -f now #再起動する reboot #すべてのユーザーに実行権限を与える chmod a+x test.command #Rootユーザーでコマンドを実行する sudo ...
その他のターミナルコマンド
#日時を表示するコマンド。 date #2012年のカレンダーを表示する cal 2020 #アクティブなジョブの表示 jobs