awk学习_3


为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 条评论

  1. 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 ~]$
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注