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
これが私が必要としているものです。
これはとても基本的なことです
awk '/pattern/{ print $0 }' file
awk
に//
を使用してpattern
を検索するよう依頼してから、その行を出力します。これはデフォルトでレコードと呼ばれ、$ 0で示されます。少なくとも ドキュメント を読んでください。
一致したWordだけを印刷したい場合。
awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file
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
マニュアルの substr
、 RSTART
、 RLENGTH
、および awk
について読んでください。
その後、これを拡張して同じ行にある複数の一致を処理することができます。私はすべてあなたの宿題をあなたのためにすることはできません:-)
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
入力の最後の行だけに興味があり、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つの引数を持つawk
match()
関数はgawk
にのみ存在し、mawk
には存在しません
これはgrep
の代わりにawk
で 後方参照正規表現 を使ったもう一つのいい解決策です。このソリューションには、インストールに対する要件が低くなります。
$ echo "xxx=a yyy=b zzz=c" | grep -Po '(?<=yyy=)[^ ]+'
b
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
このような状況では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