我有一个脚本,我想从中解析用户名和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}"/