grep
正規表現に一致する行だけが返されます。通常、私が実際に見たいのは、一致する行の上下の数行です(例:2行)。これを達成する簡単な方法はありますか?
編集者:オペレーティングシステム:UbuntuベースのBodhi Linux。コメントで述べたように、-Cは通常のバージョンでは動作しませんが、私の場合はGNU grepでした。
答え1
から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 オプションを使用すると効果がなく、警告が表示されます。
それがどれくらい簡単なのか見てください。 man
あなたの友達です。
答え2
使用アッ(携帯用):
awk '
{
arr[NR]=$0
}
END{
for (i=0;i<=NR;i++) {
if (arr[i] ~ grep){
for (j=i-count; j<=i+count; j++) {
print arr[j]
}
}
}
}
' grep=kdm count=4 /etc/passwd
ゲーム前/後に4行でユーザーをkdm
把握します。/etc/passwd
中シェンスクリプト:
#!/bin/sh
awk '
{
arr[NR]=$0
}
END{
for (i=0;i<=NR;i++) {
if (arr[i] ~ grep){
for (j=i-count; j<=i+count; j++) {
print arr[j]
}
}
}
}
' grep="$1" count="$2" "$3"
使用法:
./contextgrep <pattern> <count> <file>