给定一个包含内容的文件input.txt
:
xyMnZnMs76XHgsWJ
size: YN3hxFqFeUxXUMrQ
USPqYEnbquwFhUW7
vhJJduHZu25qHzTw
size: JaTDhQYQtLRWBLjj
uE5HGDAZN6DHU73Q
QxVPfQQaKTgR9LXQ
grnsm8bwSz5fJbQS size:
7CcuZxCHSJYhcdqg
ZuWadAaLWFwDwj5Z
怎么用if (condition) {...} else {...}
?
我尝试使用:
awk -F ':' '
IF ($1 ~ /size/) {
print "match: "$0;
} ELSE {
print "non-match: "$0;
}' input.txt
但所有行都匹配(即使是不$1
包含 的行"size"
):
match: xyMnZnMs76XHgsWJ
match: size: YN3hxFqFeUxXUMrQ
match: USPqYEnbquwFhUW7
match: vhJJduHZu25qHzTw
match: size: JaTDhQYQtLRWBLjj
match: uE5HGDAZN6DHU73Q
match: QxVPfQQaKTgR9LXQ
match: grnsm8bwSz5fJbQS size:
match: 7CcuZxCHSJYhcdqg
match: ZuWadAaLWFwDwj5Z
我期望输出是:
non-match: xyMnZnMs76XHgsWJ
match: size: YN3hxFqFeUxXUMrQ
non-match: USPqYEnbquwFhUW7
non-match: vhJJduHZu25qHzTw
match: size: JaTDhQYQtLRWBLjj
non-match: uE5HGDAZN6DHU73Q
non-match: QxVPfQQaKTgR9LXQ
non-match: grnsm8bwSz5fJbQS size:
non-match: 7CcuZxCHSJYhcdqg
non-match: ZuWadAaLWFwDwj5Z
让我们解释一下。
其语法结构
awk
是“模式{
动作}
”,其中任一组件(但不能同时使用)是可选的。当您编写时,IF ($1 ~ /size/) { print "match: "$0; }
您没有使用if
关键字,而是实际上连接了一个空字符串(未设置的变量IF
)和一个$1 ~ /size/
计算结果为0
or 的表达式 ()1
。由于字符串连接,结果被视为字符串(“0
”或“1
”),并且如果其长度非零则为“true”。任一结果都有长度,因此模式条件被视为无条件为真。此时{
动作}
被触发并且你被print "match: "$0
执行。让我们修复一下。
awk
阅读(参见 参考资料)的文档,man awk
您会发现if
…else
结构是小写的。{
此外,除了每个语句的“ action ”部分之外,您不能使用这样的结构}
。但是,请注意,您的行在
grnsm8bwSz5fJbQS size:
所需的输出中被视为不匹配,但在此代码中,它被视为匹配的输出。这是因为正则表达式/size/
匹配第一个冒号分隔的字段grnsm8bwSz5fJbQS size
。您需要识别字符串的开头和结尾以进行精确匹配 - 但更好的方法是将其作为文字字符串进行比较:或者,
甚至,
为此,我什至不会使用 a
if-statement
,它们用于更复杂的东西。你可以使用这样做:或者我的首选方法是使用名为 的变量来执行此操作
pat
,这样您以后就可以更轻松地更改它:这对我有用:
awk -F: '{if ($1 =="size") {print "match: "$0} else {print "non-match: "$0}}'
对于
awk
,您始终必须在代码中使用花括号,例如:awk '{ your code }'
另外
if
/else
不是大写字母。您可以在此处找到更多示例。