AWK替换问题

2012 年 2 月 17 日
 david_lee_cn
原始文本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
6496 次点击
所在节点    Linux
14 条回复
david_lee_cn
2012 年 2 月 17 日
思维定势。

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

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

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

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

或者
awk -F "=" "/$1='IMSI'/{print $2}"
Echoldman
2012 年 2 月 21 日
看成了“AFK”。。
eric_q
2012 年 2 月 21 日
这里用sed应该更省力些,除了@iwinux的写法,还可以这么写:
cat foo.txt|grep -v ISDN|sed -e 's/IMSI\=//' -e's/\;//'
vz33
2012 年 3 月 18 日
awk 'BEGIN{FS="=|;"}{if ($1=="IMSI")print $2}' foo.txt
polyahu
2012 年 3 月 23 日
grep -oP '(?<=IMSI=)\d+' foo.txt

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/27592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX