为awk指定多个分隔符
awk的-F参数可以指定新的记录分隔符,有些时候可能需求指定多个分隔符,比如:
width:720 height:360
如果需要取出width和height后面的值的话,一般大家会这样做,即做两次awk操作:
# echo "width:720 height:360" | awk '{print $1;print $2}' | awk -F: '{print $2}' 720 360
其实呢,通过在awk中指定两个记录分隔符(空格和:),即可一次性的提取出width和height后面的值,在awk中指定多个记录分隔符的写法(方法一)如下:
# echo "width:720 height:360" | awk -F'[ :]' '{print $2,$4}' 720 360
不过,一般像下面这样写,多一个加号表明将连续出现的记录分隔符当做一个来处理:
# echo "width:720 height:360" | awk -F'[ :]+' '{print $2,$4}' 720 360
可以尝试在height前面再增加一个空格,各位可以自己去命令行下尝试下:
# echo "width:720 height:360" | awk -F'[ :]' '{print $2,$4}' 720 height
# echo "width:720 height:360" | awk -F'[ :]+' '{print $2,$4}' 720 360
注意:
在awk中,当记录分隔符指定为空字符串(默认情况下分隔符即为空串)时,awk会将多个连续的空白看做一个单一的记录分隔符。此外,awk还会忽略开头和结尾处的空白。
awk支持正则表达式形式的记录分隔符,你可以改成其它的正则表达式来进行测试。上面虽然介绍了awk中使用多个记录分隔符的写法,但是这些记录分隔符都是单个字符,如果记录分隔符是个字符串怎么办呢?解决办法:awk支持正则表达式形式的记录分隔符,比如要指定分隔符为one和two(方法二):
# echo "i have two apples and one banana" | awk -F'one|two' '{for(i=1;i<=NF;i++)print i,"="$i}' 1 = i have 2 = apples and 3 = banana
原文地址:http://www.letuknowit.com/post/98.html
实际测试可行。
awk数组的学习
已知test.txt内容:
001 name wodi 12k
002 name yingsui 15k
003 name jeacen 10k
004 name kuqi 8k
005 name yideng 10k
006 name xiaofan 8k
[root@bt ~]# awk '/^00/ {++S[$NF]} END{for (a in S) print a,S[a]}' test.txt
15k 1
8k 2
10k 2
12k 1
提示:awk可以直接处理文本,因此,不需要先cat然后通过管道获取文件内容,那样不但不专业,而且内容多时,影响处理效率。(而且,这里先用表达式 /^00/ 进行了一个匹配过滤,可以借鉴)
《 “awk学习_3” 》 有 2 条评论
awk中特殊的多分隔符(以 [ 或 ] 为为分隔符)
https://stackoverflow.com/questions/27427142/awk-and-special-brackets-delimiters
`
[ixy@ixyzero ~]$ echo “…….{INFO1}…..[INFO2]….” | awk -F”[][]” ‘{for(i=1;i<=NF;i++)print i"=",$i}' #最方便
1= …….{INFO1}…..
2= INFO2
3= ….
[ixy@ixyzero ~]$ echo "…….{INFO1}…..[INFO2]…." | awk -F"\\\]|\\\[" '{for(i=1;i<=NF;i++)print i"=",$i}' #3个反斜线
1= …….{INFO1}…..
2= INFO2
3= ….
[ixy@ixyzero ~]$ echo "…….{INFO1}…..[INFO2]…." | awk -F"[[\\\]]" '{for(i=1;i<=NF;i++)print i"=",$i}' #这也行!
1= …….{INFO1}…..
2= INFO2
3= ….
[ixy@ixyzero ~]$ echo "…….{INFO1}…..[INFO2]…." | awk -F"[[]" '{for(i=1;i<=NF;i++)print i"=",$i}'
1= …….{INFO1}…..
2= INFO2]….
[ixy@ixyzero ~]$ echo "…….{INFO1}…..[INFO2]…." | awk -F"[]]" '{for(i=1;i<=NF;i++)print i"=",$i}'
1= …….{INFO1}…..[INFO2
2= ….
[ixy@ixyzero ~]$ echo "…….{INFO1}…..[INFO2]…." | awk -F"[[]]" '{for(i=1;i<=NF;i++)print i"=",$i}' #这个不行!
1= …….{INFO1}…..[INFO2]….
[ixy@ixyzero ~]$
`
awk多分隔符
https://stackoverflow.com/questions/27427142/awk-and-special-brackets-delimiters
https://stackoverflow.com/questions/25867060/awk-warning-escape-sequence-treated-as-plain
http://blog.51cto.com/sndapk/963405
http://www.cs.unibo.it/~renzo/doc/awk/nawkA4.pdf # 3.5 Specifying how Fields are Separated
https://www.gnu.org/software/gawk/manual/html_node/Escape-Sequences.html#Escape-Sequences