这是有效的:
awk -F"[[:space:]]|=" '/^[^#]/{print($2)}' /etc/fstab
但这个不行:
awk -F"\s|=" '/^[^#]/{print($2)}' /etc/fstab
我正在使用Ubuntu 16.04自带的awk工具。
-F"\s|="
)。
awk如何处理正则表达式:
首先,您需要了解有两种方法可以在awk中编写正则表达式:
/ere/
FS
时)/\s|=/
和"\\s|="
是等价的正则表达式,而表达式/s|=/
和"\s|="
也是等价的。
如何使用bash处理反斜杠(\
):
Bash使用\
字符来转义字符。未引用的反斜杠(\
)保留紧随其后的下一个字符的字面值(有少数例外)。单引号中的反斜杠没有特殊含义,而双引号中的反斜杠仅在后面跟着以下字符之一时才保留其特殊含义:$
、`
、"
、\
或<newline>
。
这使我们现在有以下选项:
-F"\s|="
: awk接收字符串表达式"\s|="
,并将其解析为正则表达式/s|=/
-F"\\s|="
: bash转义第二个\
,awk接收字符串表达式"\s|="
,并将其解析为正则表达式/s|=/
-F"\\\s|="
: bash转义第二个\
,awk接收字符串表达式"\\s|="
,并将其解析为正则表达式/\s|=/
-F"\\\\s|="
: bash转义第二和第四个\
,awk接收字符串表达式"\\s|="
,并将其解析为正则表达式/\s|=/
因此,以下所有内容都是等效的:
$ awk -F '\\s|=' '/^[^#]/{print $2}' /etc/fstab
$ awk -F "\\\s|=" '/^[^#]/{print $2}' /etc/fstab
$ awk -F "\\\\s|=" '/^[^#]/{print $2}' /etc/fstab
$ awk 'BEGIN{FS="\\s"}/^[^#]/{print $2}' /etc/fstab
$ awk 'BEGIN{FS="\\s"}/^[^#]/{print $2}' /etc/fstab
$ awk "BEGIN{FS=\"\\\\s|=\"}/^[^#]/{print \$2}" /etc/fstab
看一下它产生的错误:
$ awk -F"\s|=" '/^[^#]/{print($2)}' /etc/fstab
awk: warning: escape sequence `\s' treated as plain `s'
你需要正确转义 \s
。例如,以下方式对我来说有效:
$ awk 'BEGIN { FS="\\s|=" } /^[^#]/{print($2)}' /etc/fstab
-F'\\s|='
。也有可能OP没有使用GNU awk,因此\s
不会被支持,因为它是GNU扩展。顺便提一下,考虑使用-F'[[:space:]=]'
。 - Ed Morton-F"\s|="
。 - kvantour