技术解析

AWK替换问题
0
2021-07-29 11:30:17
idczone
原始文本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
思维定势。
imsi=gsub(/;/,,imsi_ary[2]) 实际得到gsub执行结果 1 或者0。
直接gsub()即可改变imsi_ary[2]的值。
closed。

awk的文档真是难懂阿,每次man awk都一头雾水

info awk 会让你雾水更多~

咦,info awk和man awk显示的信息不是一样的吗?

Awk堪称很 锋利的 ! 尤其是对文本的处理 ...

如果你用gawk的话,info给你的是一本书……

grep "8671200001" | awk -F "=" '{print $2}' | awk -F ";" '{print $1}'

sed -e "s/\(IMSI\|ISDN\)=\([0-9]\+\);/\2/"

Sorry,应该是 grep "IMSI" | sed -e "s/\([0-9]\+\)/\1/"

grep ‘IMSI’ foo.txt|cut -d"=" -f2
或者
grep ‘IMSI’ foo.txt|awk -F "=" "{print $2}"
或者
awk -F "=" "/$1='IMSI'/{print $2}"

看成了“AFK”。。

这里用sed应该更省力些,除了@iwinux的写法,还可以这么写:
cat foo.txt|grep -v ISDN|sed -e 's/IMSI\=//' -e's/\;//'

awk 'BEGIN{FS="=|;"}{if ($1=="IMSI")print $2}' foo.txt

grep -oP '(?<=IMSI=)\d+' foo.txt

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服