如何解析linux文件中的多个字符串



我有一个脚本,我想从中解析用户名和IP地址。

这是一个脚本示例。该条目适用于所有用户,脚本中大约有2000行。

if [ "$common_name" = "NUMERICUSERNAME" ]; then
if [ $(/usr/sbin/iptables -t nat -L -v | grep to: | cut -d : -f 2) = "IP.AD.DR.ESS" ] ; then
/usr/sbin/iptables -t nat -D POSTROUTING -s $(/usr/sbin/iptables -t nat -L -v | grep IP.AD.DR.ESS | gawk '{ print $(NF-2) }') -j SNAT --to-source IP.AD.DR.ESS ;
fi
/usr/sbin/iptables -t nat -A POSTROUTING -s $ifconfig_pool_remote_ip -j SNAT --to-source IP.AD.DR.ESS
fi

用户名是一个15位数字字符串。

我试过用awk解析。。。类似于awk '{print $5,$25}' filename,但找不到要捕获的正确字段。

我也尝试过不同形式的grep,但不知道如何在不导致数据错位的情况下捕获这两个字段。例如grep -oP '[0-9-]{10} [0-9:]{8}' filename给了我所有的IP或所有的用户名。。。但我似乎不知道如何同时得到这两者。

获取NUMERICSUSERNAME输出的最有效方法是匹配IP.AD.DR.ESS,比如这个

NUMERICUSERNAME1 IP.AD.DR.ESS1
NUMERICUSERNAME2 IP.AD.DR.ESS2
....
NUMERICUSERNAME2000 IP.AD.DR.ESS2000

还要注意,该条目在多个位置具有IP.AD.DR.ESS,这导致我捕获了重复项。这也可以避免吗?

EDIT:的输出

$ awk '/common_name/ {u = substr($5,2,15)}
/--to-source/ {print u, $(NF-1)}' < script

输出:

IP.AD.DR.ESS1
--to-source
IP.AD.DR.ESS10
--to-source
IP.AD.DR.ESS100
...
IP.AD.DR.ESS75
--to-source
NUMERICUSERNAME IP.AD.DR.ESS76
SAMENUMERICUSERNAME --to-source
SAMENUMERICUSERNAME IP.AD.DR.ESS77

记事本++屏幕捕获

编辑

溶液的样品输出

NUMBERICUSERNAME1 IP.AD.DR.ESS1
NUMBERICUSERNAME1 --to-source
NUMBERICUSERNAME2 IP.AD.DR.ESS2
NUMBERICUSERNAME2 --to-source

可能是这样的:

$ awk '/common_name/ {u = substr($5,2,15)}
/iptables -t nat -A POSTROUTING/ {print u, $NF}' < script
NUMERICUSERNAME IP.AD.DR.ESS

如果/common_name/和/或/iptables -t nat -A POSTROUTING/正则表达式捕捉到不需要的行,您可以对它们进行一些改进,使它们更有选择性。示例:

/"$common_name"s*=s*"[[:digit:]]{15}"/

最新更新