使用awk的正则表达式只返回带有一个数字字符的列?

时间:2016-05-02 11:47:09

标签: bash awk

我有两种不同类型的日志行,字段$5是:

ffe5a6fb-2933-4c01-855d-3033933600bf
3

如何使用awk编写正则表达式,以便仅提取包含一个字符的字段?

这是我的解决方案,但它不起作用,它将返回所有内容!

awk '/[0-9]\+/ {print $5}'

我会感激您的帮助吗?

3 个答案:

答案 0 :(得分:2)

执行:

awk '$5~/^.$/ {print $5}' file.txt

仅匹配一个数字:

awk '$5~/^[0-9]$/ {print $5}' file.txt

示例:

$ cat file.txt
abcdX1yad45das ffe5a6fb-2933-4c01-855d-3033933600bf ffe5a6fb-2933-4c01-855d-3033933600bf ffe5a6fb-2933-4c01-855d-3033933600bf ffe5a6fb-2933-4c01-855d-3033933600bf 3 foo
abcdX1yad45das ffe5a6fb-2933-4c01-855d-3033933600bf ffe5a6fb-2933-4c01-855d-3033933600bf ffe5a6fb-2933-4c01-855d-3033933600bf 3 foo
abcdX2fad45das
abcdX3had45das
abcdX4wad45das
abcdX5mad45das

$ awk '$5~/^.$/ {print $5}' file.txt
3

答案 1 :(得分:1)

写作的时间稍长,但如果你只关心字段的长度,我认为使用./contrib/download_prerequisites会更清楚:

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  testCompile 'junit:junit:4.12'
  compile 'com.android.support:appcompat-v7:23.2.0'
  compile 'com.android.support:design:23.2.0'
  compile 'com.android.support:support-v4:23.3.0'
}

否则,如果您想匹配lengthawk 'length($5) == 1 { print $5 }' file 范围内的单个字符,那就是:

0

...或匹配您所在地区的任何数字:

9

某些版本的awk(例如GNU awk)理解速记awk '$5 ~ /^[0-9]$/ { print $5 }' file 而不是awk '$5 ~ /^[[:digit:]]$/ { print $5 }' file

答案 2 :(得分:0)

不要逃避“+”号。

awk '/[0-9]+/ {print $5}'