zoukankan      html  css  js  c++  java
  • (转)Linux中awk的gsub函数用法

    原文:https://www.cnblogs.com/Linux-guowen/p/12659776.html

    一。遇到的问题:

    问题:echo "a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)'为啥 输出后 2011-11-22 变成 2 了?

    解答:
    gsub(/-/,"",$4)的值是2【在赋值的情况下是这样的~】,你将2赋值给$4 ,gsub返回的是替换的次数。
    如下是测试结果:
    [root@Test230 ~]# echo "a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)'
    a b c 2 a:d

    看另一种情况,只是替换的话~

    [root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk 'gsub(/-/,"",$4)'
    a b c 20111122 a:d
    [root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk 'gsub(/-/,"_",$4)'
    a b c 2011_11_22 a:d

    二。实例详解

    下面我们来总结一下这个gsub的用法:

    有一个文本文件data.test的内容如下:

    0001|20081223efskjfdj|EREADFASDLKJCV
    0002|20081208djfksdaa|JDKFJALSDJFsddf
    0003|20081208efskjfdj|EREADFASDLKJCV
    0004|20081211djfksdaa1234|JDKFJALSDJFsddf

    以'|'为分隔, 现要将第二个域字母前的数字去掉,其他地方都不变, 输出为:
    0001|efskjfdj|EREADFASDLKJCV
    0002|djfksdaa|JDKFJALSDJFsddf
    0003|efskjfdj|EREADFASDLKJCV
    0004|djfksdaa1234|JDKFJALSDJFsddf

    解法:

    awk -F '|'  '{sub(/[0-9]+/,"",$2);print $0}' data.test 

    三。sub和gsub的区别

    sub匹配第一次出现的符合模式的字符串,相当于 sed 's//'   
    gsub匹配所有的符合模式的字符串,相当于 sed 's//g'   

    awk的sub函数用法:
    sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录,替换只发生在第一次匹配的时候。

    实例:
    $ awk '{ sub(/test/, "mytest"); print }' testfile
    $ awk '{ sub(/test/, "mytest", $1); print }' testfile
    第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。
    第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候

    gsub函数作用如sub,但它在整个文档中进行匹配。        

    实例:
    $ awk '{ gsub(/test/, "mytest"); print }' testfile
    $ awk '{ gsub(/test/, "mytest", $1); print }' testfile
    第一个例子在整个文档中匹配test,匹配的都被替换成mytest。
    第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。


    只有当记录中的域有改变的时候 ,指定0FS变量才有用, 如果记录中的域无变化, 指定OFS产生不了实际效果。

    awk -F'|' -v OFS='|' '{ gsub(/[0-9]/, "", $3); print $0; }' data.txt   

    将把第三个域中所有数字都去掉。

  • 相关阅读:
    开源软件、自由软件及免费软件的区别 2015-04-13 22:50 45人阅读 评论(0) 收藏
    Linux中fork()函数详解 2015-04-13 22:48 30人阅读 评论(0) 收藏
    ubuntu系统文件夹目录说明 分类: Ubuntu学习笔记 2015-04-13 21:21 49人阅读 评论(0) 收藏
    gdb使用笔记 2015-04-11 19:55 32人阅读 评论(0) 收藏
    Vim 使用笔记 2015-04-10 19:50 51人阅读 评论(0) 收藏
    access_ok()
    linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析(引用)
    编译andriod源码出错:java.lang.UnsupportedClassVersionError: com/google/doclava/Doclava : Unsupported
    Linux内核树的建立-基于ubuntu系统
    sysfs接口整理
  • 原文地址:https://www.cnblogs.com/liujiacai/p/15544713.html
Copyright © 2011-2022 走看看