AWK替换问题

2012-02-17 18:15:21 +08:00
 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
5460 次点击
所在节点    Linux
14 条回复
david_lee_cn
2012-02-17 18:44:40 +08:00
思维定势。

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

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

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

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

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

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

https://www.v2ex.com/t/27592

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

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

© 2021 V2EX