web-dev-qa-db-ja.com

grep + A:試合後のすべてを出力

こんにちは、以下のようなURLのリストを含むファイルがあります。

file1:

http://www.google.com
http://www.bing.com
http://www.yahoo.com
http://www.baidu.com
http://www.yandex.com
....

http://www.yahoo.com の後にすべてのレコードを取得したい場合、結果は以下のようになります。

file2:

http://www.baidu.com
http://www.yandex.com
....

Yahoo.comが使用している場所の行番号を見つけるためにgrepを使用できることを知っています

$grep -n 'http://www.yahoo.com' file1
3 http://www.yahoo.com

しかし、行番号3の後にファイルを取得する方法がわかりません。また、grep -Aにはフラグがあり、一致した後に行を出力します。ただし、一致後に必要な行数を指定する必要があります。私はその問題を回避する何かがあるのだろうかと思っています。のような:

PSEUDO CODE:
$ grep -n 'http://www.yahoo.com' -A all file1 > file2 

私が取得した行番号とwc -lを使用してyahoo.comの後の行数を取得できることはわかっていますが、かなり不自由だと感じています。

便利で簡単なソリューションを楽しみにしています。最初から問題を複雑にしていることを気軽に批判してください。awkコマンドとsedコマンドも歓迎します。

30
B.Mr.W.

Awk

Awkを使用してもかまわない場合:

awk '/yahoo/{y=1;next}y' data.txt

このスクリプトには2つの部分があります。

/yahoo/ { y = 1; next }
y

最初の部分では、yahooの行に遭遇した場合、変数y = 1を設定し、その行をスキップします(nextコマンドは次の行にジャンプするため、スキップします現在の行でさらに処理する場合)。 nextコマンドなしでは、行yahooが出力されます。

2番目の部分は、以下の略記です。

y != 0 { print }

つまり、行ごとに、変数yがゼロ以外の場合、その行を出力します。 awkでは、変数を参照すると、その変数が作成され、コンテキストに応じてゼロまたは空の文字列になります。 yahooに遭遇する前に、変数yは0であるため、スクリプトは何も出力しません。遭遇後yahoo、yは1なので、その後のすべての行が出力されます。

Sed

または、sedを使用すると、yahooを含む行までのすべてが削除されます。

sed '1,/yahoo/d' data.txt 
44
Hai Vu

これは、sedよりもgrepの方がはるかに簡単です。 sedは、その1文字のコマンドをすべての行を含む範囲に適用できます。これの一般的な構文は

START , STOP COMMAND

スペースを除く。 STARTおよびSTOPはそれぞれ数値(1から始まる「行番号N」を意味する)にすることができます。ドル記号(「ファイルの終わり」を意味する)、またはスラッシュで囲まれた正規表現(「この正規表現に一致する最初の行」を意味する)。 (正確なルールはもう少し複雑です; GNU sedマニュアルに詳細があります 。)

だから、あなたはあなたがそうしたいことをすることができます:

sed -n -e '/http:\/\/www\.yahoo\.com/,$p' file1 > file2

-nは「特に指示がない限り何も出力しない」ことを意味し、-eディレクティブは「正規表現に一致する行の最初の出現から/http:\/\/www\.yahoo\.com/の終わりまで」を意味します。ファイル、print。」

これにより、出力にhttp://www.yahoo.com/の行が含まれます。そのポイント以降のすべてのものが必要で、その行自体は必要ない場合、それを行う最も簡単な方法は、操作を反転することです

sed -e '1,/http:\/\/www\.yahoo\.com/d' file1 > file2

つまり、「1行目から正規表現に一致する最初の行まで/http:\/\/www\.yahoo\.com/delete the line」(そして、暗黙的に他のすべてを印刷します。-nnot今回は使用されました)。

13
zwol
awk '/yahoo/ ? c++ : c' file1

またはゴルフ

awk '/yahoo/?c++:c' file1

結果

 http://www.baidu.com 
 http://www.yandex.com 
7
Steven Penny

これはPerlで最も簡単に実行できます。

Perl -ne 'print unless 1 .. m(http://www\.yahoo\.com)' file

つまり、1行目からそのパターンが最初に現れるまでの間にare n’tであるすべての行を印刷します。

3
tchrist

スクリプトを使用して

#get index of yahoo Word
index=`grep -n "yahoo" filepath | cut -d':' -f1`
#get total number of lines in file
totallines=`wc -l filepath | cut -d' ' -f1`
#subtract totallines with index
result=`expr $total - $index`
#gives the desired output
grep -A $result "yahoo" filepath
2
user1502952