京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

grepコマンドで文字列処理をやってみた件【その1】ファイル内のテキストに対する処理とか

はじめに

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

関連記事

skume.net