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

まずは、データ分析、コマンドラインのメモとして

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 : ディレクトリ移動

f:id:skume:20200607071106p:plain:w400

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