普通的多个分隔符,需要加【】
如:awk -F [:@] '{ print $2, $3 }' ssh.txt
特殊的多个分隔符,需要加\
如果多个分隔符中有至少一个特殊字符,那么还需要在中括号外加上双引号或者单引号,并且使用两个或两个以上的\
将其进行转义
$
、^
、(
、)
、[
、]
、?
、.
、|
如:awk -F '[\\^\\|]' '{ print $1,$2,$3}' ssh.txt
报错
需要转义符号‘ 和“ ,但是转义有警告提醒
awk -F "[\'\"]" '{print $2}' aa.txt
报错:
awk: warning: escape sequence `\'' treated as plain `''
决解的方法:要弄\\\个,两个会失败,原来如下:
awk -F "[\\\'\\\"]" '{print $2}' aa.txt
来自:https://blog.csdn.net/mydreamongo/article/details/9960491
通过试验,我发现这里面有三层转义,按执行顺序依次是:
shell
awk
field separator processor
要禁止shell转义,请用单引号包围 FS 的值,否则使用双引号或干脆不用引号(仅当参数不包含空格时)。
awk的转义是无法禁止的,所以只能通过累加转义来抵消它的影响,也就是用 '\\' 表达 '\'。
field separator processor 是我想象出来的一个东西,总之我们的目的就是让 FS 的值正好就是最根本的那个正则表达式。
以下是一些示例,正反面都有。示例程序的任务是从"[234 abc] lalala"中提取出"234 abc"。
(1) 失败,"[
]" 被 awk 转义成 "[[]]" 了
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F '[
]' '{print $2}'
awk: warning: escape sequence `
′treatedasplain‘[′awk:warning:escapesequence‘′treatedasplain‘[′awk:warning:escapesequence‘
' treated as plain `]'
(2) 成功,"[\
]]"被awk转义成"[\[]]"被awk转义成"[\[
]" 了,而这正是我们想要的结果
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F '[\
\\]]' '{print $2}'
234 abc
(3) 失败,"[\\[\\]]" 先被 shell 转移成 "[\[\\]]' '{print $2}' 234 abc (3) 失败,"[\\[\\]]" 先被 shell 转移成 "[\[
]",再被 awk 转义成 "[[]]" 了
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F "[\
]]"′print$2′awk:warning:escapesequence‘\[′treatedasplain‘[′awk:warning:escapesequence‘]]"′print$2′awk:warning:escapesequence‘\[′treatedasplain‘[′awk:warning:escapesequence‘
' treated as plain `]'
(4) 成功,"[\\\
\\\\]]" 先被 shell 转义成 "[\\[\\]]",再被 awk 转义成 "[\[\\\\]]" 先被 shell 转义成 "[\\[\\]]",再被 awk 转义成 "[\[
]"
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F "[\\\\[\\\\]]" '{print $2}'
234 abc
(5) 成功,跟(4)的原理相同
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F [\\\\[\\\\]] '{print $2}'
234 abc
Comments | NOTHING