awkパターン検索で文字列長を指定する

awkパターン検索で文字列長を指定する

何が間違っているのかわかりません。 test.logが与えられたら:

123.123.123.123 321.321.321.321 GET /test1234/asdfasdfpioasdfjkhweris,9
123.123.123.123 321.321.321.321 GET /4321test/asdfasdfpioasdfjkhweris,9
123.123.123.123 321.321.321.321 GET /test123456/asdfasdfpioasdfjkhweris,9

/と/の間の文字数を指定して最初の2つを区別しようとしています。

これは効果があります

cat test* | awk '{if($4 ~ /^\/[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\//) print $0}'

しかし、これはそうではありません

cat test* | awk '{if($4 ~ /^\/[a-zA-Z0-9]{8,}\//) print $0}'

私は何を見逃していますか?

私も次のことを試しました。

cat test* | awk '$4 ~ /^\/[a-zA-Z0-9]{8}\// {print $0}'

これも機能しません。

アップデート:gawkを使って同じコマンドを試しましたが、私にはうまくいきますが、それでも機能しません。

ベストアンサー1

cat test* | gawk --re-interval '$4 ~ /^\/[a-zA-Z0-9]{8}\// {print $0}'
# OR
cat test* | gawk --re-interval '{if( $4 ~ "^/[a-zA-Z0-9]{8}/") {print $0}}'

GNU awkのマンページから:

  • --re-interval – 正規表現の一致で間隔式を有効にします。

また、少なくとも1つの数字を含める必要があります。

gawk --re-interval '$4 ~ "^/[a-zA-Z0-9]{8}/" &&
                    $4 ~ "^/[^/]{0,7}[0-9]" {print $0}'

おすすめ記事