Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
david_lee_cn
V2EX  ›  Linux

AWK替换问题

  •  
  •   david_lee_cn · Feb 17, 2012 · 7028 views
    This topic created in 5372 days ago, the information mentioned may be changed or developed.
    原始文本foo.txt内容
    IMSI=8671200001;
    ISDN=8612345;
    IMSI=8671200001;
    ISDN=8612345;
    IMSI=8671200001;
    ISDN=8612345;
    IMSI=8671200001;


    cat foo.txt | awk '{
    if($0 ~ /IMSI=/ {
    split($0,imsi_ary,"=")
    imsi=gsub(/;/,,imsi_ary[2])
    }
    print imsi
    }'

    问什么输出是
    1
    1
    1

    而不是想要的
    8671200001
    8671200001
    8671200001
    14 replies  •  1970-01-01 08:00:00 +08:00
    david_lee_cn
    david_lee_cn
    OP
    Feb 17, 2012
    1
    思维定势。

    imsi=gsub(/;/,,imsi_ary[2]) 实际得到gsub执行结果 1 或者0。

    直接gsub()即可改变imsi_ary[2]的值。

    closed。
    ufo22940268
    ufo22940268
    Feb 21, 2012
    2
    awk的文档真是难懂阿,每次man awk都一头雾水
    gastlygem
    gastlygem
    Feb 21, 2012
    3
    @ufo22940268 info awk 会让你雾水更多~
    ufo22940268
    ufo22940268
    Feb 21, 2012
    4
    @gastlygem 咦,info awk和man awk显示的信息不是一样的吗?
    kojp
    kojp
    Feb 21, 2012
    5
    Awk堪称很 锋利的 ! 尤其是对文本的处理 ...
    gastlygem
    gastlygem
    Feb 21, 2012
    6
    @ufo22940268 如果你用gawk的话,info给你的是一本书……
    likuku
    likuku
    Feb 21, 2012
    7
    grep "8671200001" | awk -F "=" '{print $2}' | awk -F ";" '{print $1}'
    iwinux
    iwinux
    Feb 21, 2012
    8
    sed -e "s/\(IMSI\|ISDN\)=\([0-9]\+\);/\2/"
    iwinux
    iwinux
    Feb 21, 2012
    9
    Sorry,应该是 grep "IMSI" | sed -e "s/\([0-9]\+\)/\1/"
    laiwei
    laiwei
    Feb 21, 2012 via Android
    10
    grep ‘IMSI’ foo.txt|cut -d"=" -f2

    或者
    grep ‘IMSI’ foo.txt|awk -F "=" "{print $2}"

    或者
    awk -F "=" "/$1='IMSI'/{print $2}"
    Echoldman
    Echoldman
    Feb 21, 2012
    11
    看成了“AFK”。。
    eric_q
    eric_q
    Feb 21, 2012
    12
    这里用sed应该更省力些,除了@iwinux的写法,还可以这么写:
    cat foo.txt|grep -v ISDN|sed -e 's/IMSI\=//' -e's/\;//'
    vz33
    vz33
    Mar 18, 2012
    13
    awk 'BEGIN{FS="=|;"}{if ($1=="IMSI")print $2}' foo.txt
    polyahu
    polyahu
    Mar 23, 2012
    14
    grep -oP '(?<=IMSI=)\d+' foo.txt
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4510 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 03:52 · PVG 11:52 · LAX 19:52 · JFK 22:52
    ♥ Do have faith in what you're doing.