(Linux)grepで発見行の前後も表示する

4-1.文字列検索

grepは指定したテキストから文字列を探すコマンドです。
文字列の存在する行だけでなく、オプションを指定することで、発見行の前後の行も表示することができます。

今回は、確認用のテキストとして/usr/share/dict/wordsを使いますが、/usr/share/dict/wordsが存在しない場合は、以下のようにインストールできます。

takk~$ sudo apt install wamerican-large
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  adwaita-icon-theme at-spi2-core ca-certificates-java dconf-gsettings-backend

(省略)

以前に未選択のパッケージ wamerican-large を選択しています。
(データベースを読み込んでいます ... 現在 65091 個のファイルとディレクトリがインストールされています。)
.../wamerican-large_2018.04.16-1_all.deb を展開する準備をしています ...
wamerican-large (2018.04.16-1) を展開しています...
wamerican-large (2018.04.16-1) を設定しています ...
man-db (2.8.5-2) のトリガを処理しています ...
dictionaries-common (1.28.1) のトリガを処理しています ...
takk~$

では、本題のgrepです。
まずは、発見したい文字列のみを、行番号付きで表示してみます。

takk~$ grep -n ^tomato$ /usr/share/dict/words
94473:tomato
takk~$

94473行目にtomatoが見つかりました。

次は、tomatoがある行の、前5行表示してみます。

takk~$ grep -nB5 ^tomato$ /usr/share/dict/words
94468-tomahawk
94469-tomahawk's
94470-tomahawked
94471-tomahawking
94472-tomahawks
94473:tomato
takk~$

tomahawk〜という文字列が見つかりました。

B5オプションの、「B」はBefore、「5」は5行という意味です。
行番号の後にある:や-は、
:が目的の文字列。
-はBオプションで表示された行を表します。

最後に、tomatoの前後1行を表示してみます。

takk~$ grep -nC1 ^tomato$ /usr/share/dict/words
94472-tomahawks
94473:tomato
94474-tomato's
takk~$

「C」はCenterですね。

man grepには、このように書かれています。

前後の文脈行の制御
    -A NUM, --after-context=NUM
           NUM で指定した行数だけ、パターンにマッチした行の後に続く文脈も表
           示します。  マッチした行を含むグループ同士の間には、グループを区
           切る印 (--) からなる行を置きます。 -o や --only-matching  と同時
           に使うと、このオプションは効果がなく、警告メッセージを出します。

    -B NUM, --before-context=NUM
           NUM で指定した行数だけ、パターンにマッチした行に先行する文脈も表
           示します。  マッチした行を含むグループ同士の間には、グループを区
           切る印  (--) からなる行を置きます。 -o や --only-matching と同時
           に使うと、このオプションは効果がなく、警告メッセージを出します。

    -C NUM, -NUM, --context=NUM
           NUM で指定した行数だけ、パターンにマッチした行の前後の文脈も表示
           します。  マッチした行を含むグループ同士の間には、グループを区切
           る印 (--) からなる行を置きます。 -o や --only-matching  と同時に
           使うと、このオプションは効果がなく、警告メッセージを出します。

コメント

タイトルとURLをコピーしました