awk + ​​僅當第二個欄位符合 hours:min:sec 時才列印行

awk + ​​僅當第二個欄位符合 hours:min:sec 時才列印行

日誌檔是這樣的

34.3.23.58  07:20:01  AM                          all     0.02        0.00      0.02     0.00     0.00    99.97
34.3.23.58  07:30:01  AM                          all     0.02        0.00      0.02     0.00     0.00    99.97
34.3.23.58  07:40:01  AM                          all     0.02        0.00      0.02     0.00     0.00    99.97
34.3.23.58  Average:  all                         0.02    0.00        0.02      0.00     0.00     99.96
34.3.23.60  Linux     3.10.0-514.26.2.el7.x86_64  (dns)  09/25/2019  _x86_64_  (4       CPU)

我們只想捕獲第二個字段為小時:分鐘:秒時的行

如下預期結果

cat info.txt 

34.3.23.58  07:20:01  AM                          all     0.02        0.00      0.02     0.00     0.00    99.97
34.3.23.58  07:30:01  AM                          all     0.02        0.00      0.02     0.00     0.00    99.97
34.3.23.58  07:40:01  AM                          all     0.02        0.00      0.02     0.00     0.00    99.97

我們嘗試

cat info.txt | awk '$2 =~ [0-9][0-9]/:[0-9][0-9]:[0-9][0-9]'

但運行時出現錯誤

awk: cmd. line:1: $2 =~ [0-9][0-9]/:[0-9][0-9]:[0-9][0-9]
awk: cmd. line:1:     ^ syntax error
awk: cmd. line:1: $2 =~ [0-9][0-9]/:[0-9][0-9]:[0-9][0-9]
awk: cmd. line:1:           ^ syntax error
awk: cmd. line:1: $2 =~ [0-9][0-9]/:[0-9][0-9]:[0-9][0-9]
awk: cmd. line:1:                ^ syntax error
awk: cmd. line:1: $2 =~ [0-9][0-9]/:[0-9][0-9]:[0-9][0-9]
awk: cmd. line:1:                  ^ unterminated regexp

答案1

正確的語法是

<info.txt awk '$2 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/'

變化:

  • 沒有無用的使用cat
  • 運營商是~.
  • 此模式需要用斜線 ( /regex/) 括起來。
  • ^並分別$匹配匹配字串的開頭和結尾(此處為$2)。

相關內容