我刚刚用gawk检查了所有输出文件,我尽量避免使用gawk。 怎么做
gawk 'NF \!= 6' file
与
不同gawk 'NF != 6' file
也就是说,反斜杠如何改变这个表达式的含义?
是否应输出字段数不同于6且以反斜杠结尾的行?
我的文件出现以下错误:
gawk: ^ backslash not last character on line
任何人
答案 0 :(得分:2)
如果您使用双引号而不是单引号,则!
是一个特殊字符,应使用反斜杠进行转义。重要的是,您正在逃避感叹号,以便您的 shell 看不到它。
gawk "NF \!= 6" file
在双引号内,shell会在将参数传递给gawk之前将\!
转换为!
。在调用gawk时,反斜杠就消失了。
但是,对于单个qutoes,shell将忽略!
个字符,因此不需要使用反斜杠来转义它们。事实上,正如你发现这样做是一个语法错误,因为反斜杠最终会被传递给gawk,这就是意外\
上的barf。
答案 1 :(得分:1)
没有反斜杠的行按预期工作。但是,如果你想知道,反斜杠通常用于scape特殊字符(它们失去了它们的特殊含义并用作它们自己),也用于分割长行,所以你可以写一些像(在shell下):
$ gawk 'NF \
!= 6' file
它会产生同样的效果。
特别是你的例子有点棘手。您将字符串放在单引号内。这使shell不会修改您编写的内容,并将其传递给程序。如果你使用反斜杠表达式,gawk会在一个没有意义的地方找到一个'\
'(在gawk中它只用于分割长行和字符串中的scape字符)。在我用两行反斜杠写的例子中,gawk接收了两条用反斜杠分开的行(概念上是一行)。
答案 2 :(得分:1)
如果您尝试匹配不具有6个字段且以反斜杠结尾的行,则这是一种方法:
gawk -v 'patt=\\\\$' 'NF != 6 && $0 ~ patt' file
Gawk(和其他AWK)有一些关于反斜杠转义的复杂规则。这就是为什么他们在前面的命令中有四个反斜杠的原因。 (美元符号表示数据文件中输入行的结尾,与任何正则表达式一样。)
答案 3 :(得分:1)
无论您使用双引号还是单引号,如果您使用类似Bourne的shell,gawk将会看到与引号之间出现的程序完全相同的程序。即使在双引号中,Bourne和类似csh的shell在消耗可能需要转义的字符之前只消耗\(比如$,在csh的情况下,! - 因此在csh中,这个程序看起来在语法上对gawk来说是正确的,尽管它仍然不会做你想做的事。
!在这种情况下没有任何意义,所以它给出了一个错误。要“输出字段数不同于6且以反斜杠结尾的行”,请使用:
gawk 'NF != 6 && /\\$/' file
即:匹配没有6个字段的行,并且匹配\紧接在行尾($)之前。 \必须用另一个反斜杠进行转义,因为gawk也使用\来进行转义 - 虽然在gawk的情况下,所有 \(除了被另一个转义的那些)被吸收;那些不逃避特殊性格的人只是被遗弃了。
如果没有关联的操作,则在满足此条件语句时将采用默认操作(打印行)。