web-dev-qa-db-ja.com

awkを使ってマッチした正規表現パターンを印刷するにはどうすればいいですか?

awkを使用して、正規表現パターンに一致するファイル内のWordを見つける必要があります。

私はのみパターンにマッチしたWordを印刷したいです。

だから、並んでいるなら、私は持っている:

xxx yyy zzz

そしてパターン:

/yyy/

私は取得したいだけです:

yyy

編集:おかげでくるみ私はこのようなものを書くことができた:

awk '{
        for(i=1; i<=NF; i++) {
                tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
                if(tmp) {
                        print $i
                }
        }
}' $1

これが私が必要としているものです。

86
marverix

これはとても基本的なことです

awk '/pattern/{ print $0 }' file

awk//を使用してpatternを検索するよう依頼してから、その行を出力します。これはデフォルトでレコードと呼ばれ、$ 0で示されます。少なくとも ドキュメント を読んでください。

一致したWordだけを印刷したい場合。

awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file
127
kurumi

GNUのgrep -oの振る舞いをエミュレートしようとしているようです。これにより、各行で最初の一致のみが必要になります。

awk 'match($0, /regex/) {
    print substr($0, RSTART, RLENGTH)
}
' file

これが例です:

% awk 'match($0, /a.t/) {
    print substr($0, RSTART, RLENGTH)
}
' /usr/share/dict/words | head
act
act
act
act
aft
ant
apt
art
art
art

matchマニュアルの substrRSTARTRLENGTH 、および awk について読んでください。

その後、これを拡張して同じ行にある複数の一致を処理することができます。私はすべてあなたの宿題をあなたのためにすることはできません:-)

95
Johnsyweb

gawkは、これをアクションとして使用して、各行の一致部分を取得できます。

{ if (match($0,/your regexp/,m)) print m[0] }

match(string、regexp [、array])arrayが存在する場合、それはクリアされてから、arrayの0番目の要素がregexpによってマッチしたstringの全部分に設定されます。 regexpが括弧を含む場合、arrayの整数添字の要素は対応する括弧で囲まれた部分式に一致する文字列の部分を含むように設定されます。 http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions

28
royas

入力の最後の行だけに興味があり、1つの一致だけを見つけることを期待している場合(例えば、Shellコマンドの要約行の一部)、 から採用されるこの非常にコンパクトなコードを試すこともできます。 `awk`を使って正規表現のマッチを印刷するにはどうすればいいですか?

$ echo "xxx yyy zzz" | awk '{match($0,"yyy",a)}END{print a[0]}'
yyy

あるいは部分的な結果を伴うより複雑なバージョン:

$ echo "xxx=a yyy=b zzz=c" | awk '{match($0,"yyy=([^ ]+)",a)}END{print a[1]}'
b

警告:3つの引数を持つawkmatch()関数はgawkにのみ存在し、mawkには存在しません

これはgrepの代わりにawk後方参照正規表現 を使ったもう一つのいい解決策です。このソリューションには、インストールに対する要件が低くなります。

$ echo "xxx=a yyy=b zzz=c" | grep -Po '(?<=yyy=)[^ ]+'
b
9
Daniel Alder

Perlがオプションの場合、これを試すことができます。

Perl -lne 'print $1 if /(regex)/' file

大文字と小文字を区別しないマッチングを実装するには、i修飾子を追加します。

Perl -lne 'print $1 if /(regex)/i' file

試合後にすべてを印刷するには:

Perl -lne 'if ($found){print} else{if (/regex(.*)/){print $1; $found++}}' textfile

試合と試合後のすべてを印刷するには:

Perl -lne 'if ($found){print} else{if (/(regex.*)/){print $1; $found++}}' textfile
9
Chris Koknat

このような状況ではsedを使用することも優雅です。例(行を行から一致したグループ "yyy"に置き換えます):

$ cat testfile
xxx yyy zzz
yyy xxx zzz
$ cat testfile | sed -r 's#^.*(yyy).*$#\1#g'
yyy
yyy

関連するマニュアルページ: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions

2
Konrad Brodzik