awk脚本和反斜杠

时间:2012-12-20 05:36:04

标签: bash unix awk cygwin backslash

我是Unix的新手。

${AWK} '\!/^ / && \!/^-/ && \!/^</ && \!/^$/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt

当我像以前一样运行命令时,会在{Cygwin窗口中打印errorInfo,如下所示:

awk: commandline:1: ^ backslash not last character on line

实际上,我的角色是将csh翻译为bash以进行学习。我没有写那段代码。所以,我所知道的是:

"\!/regex/" : is a model unit."\" is belong to the awk synax for cut down the long sentence
"!"means logical NOT,"/regex/" means one model.btw,"&&" means logical AND.

我无法弄清楚哪里出错了。谁能给我一个标志?

1 个答案:

答案 0 :(得分:3)

csh'metasyntactic zoo'意味着!即使在单引号内也是历史运算符,或类似的东西。在源自Bourne shell的sane ^ H ^ H ^ H ^ H shell中,!并不是一个大问题,你可以简单地写一下:

${AWK} '!/^ / && !/^-/ && !/^</ && !/^$/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt

当然,这可以进一步简化:

${AWK} '!/^[- <]/ && !/^$/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt

查找行的开头,后跟除空白,短划线或小于(不是空行)之外的其他内容。使用否定的字符类也可以简化:

${AWK} '/^[^- <]/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt

查找以空白,短划线或小于等字符开头的行(但必须包含至少一个字符,因此会自动排除空行)。最后一个版本甚至可以在csh中正常运行,因为它根本不使用任何!