何が間違っているのかわかりません。 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}'
答え2
なぜ試してみませんか?
awk -F/ 'length($2) == 8 '
-F/
/を区切り記号として使用length($2)
長さの計算- デフォルトのawkジョブはそれを印刷します。