如何在awk中对模式进行if else匹配

时间:2017-06-26 07:30:28

标签: shell awk grep

我尝试了以下命令: awk'/ search-pattern / {print $ 1}' 如何为上述命令编写else部分?

5 个答案:

答案 0 :(得分:6)

一种简单的方法是,

/REGEX/ {action-if-matches...} 
! /REGEX/ {action-if-does-not-match}

这是一个简单的例子,

$ cat test.txt
123
456
$ awk '/123/{print "O",$0} !/123/{print "X",$0}' test.txt
O 123
X 456

相当于上述内容,但没有违反DRY principle

awk '/123/{print "O",$0}{print "X",$0}' test.txt

这在功能上等同于awk '/123/{print "O",$0} !/123/{print "X",$0}' test.txt

答案 1 :(得分:6)

Classic way:

awk '{if ($0 ~ /pattern/) {then_actions} else {else_actions}}' file

$0代表整个输入记录。

Another idiomatic way 基于三元运算符语法selector ? if-true-exp : if-false-exp

awk '{print ($0 ~ /pattern/)?text_for_true:text_for_false}'
awk '{x == y ? a[i++] : b[i++]}'

awk '{print ($0 ~ /two/)?NR "yes":NR "No"}' <<<$'one two\nthree four\nfive six\nseven two'
1yes
2No
3No
4yes

答案 2 :(得分:5)

awk的默认操作是打印一行。我们鼓励您使用更多惯用的awk

awk '/pattern/' filename
#prints all lines that contain the pattern.
awk '!/pattern/' filename
#prints all lines that do not contain the pattern.
# If you find if(condition){}else{} an overkill to use
awk '/pattern/{print "yes";next}{print "no"}' filename
# Same as if(pattern){print "yes"}else{print "no"}

答案 3 :(得分:4)

根据您要在else部分中执行的操作以及有关脚本的其他内容,请在以下选项中进行选择:

awk '/regexp/{print "true"; next} {print "false"}'

awk '{if (/regexp/) {print "true"} else {print "false"}}'

awk '{print (/regexp/ ? "true" : "false")}'

答案 4 :(得分:0)

此命令将检查$ 1 $ 2和$ 7列中的值是否大于1、2和5。

!IF!值不匹配,它们将被我们在awk中声明的过滤器忽略。

(您可以使用逻辑运算符和=“ &&”; or =“ ||”。)

awk '($1 > 1) && ($2 > 1) && ($7 > 5)

您可以使用“ vmstat 3”命令监视系统,其中“ 3”表示新值之间的延迟时间为3秒

vmstat 3 | awk '($1 > 1) && ($2 > 1) && ($7 > 5)'

我给计算机加了USB连接的硬盘之间的13GB复制空间,并在Chrome浏览器中滚动了YouTube视频。

vmstat filtered column values

enter image description here