我想提取我的名字&来自以下字符串的 ipaddress (其中;
是分隔符)
INPUT:
i-03ghijklmn345;abc;xyz;pqr;null;abc;null;null;null;disabled;/dev/sda1;abc;abc: User initiated shutdown;abc;abc;vpc-abc;**192.186.40.255**;abc /dev/sda1 vol-abc 2017-15-14T12:04:17.000z
我只能使用([0-9]{1,3}[\.]){3}[0-9]{1,3}
从中检索 ipaddress ,但我需要一行中的两个字符串
输出:
i-03ghijklmn345;192.186.40.255
答案 0 :(得分:1)
不需要AWK。使用grep
:
# Partial Bash script
I_NAME=$(cat your_file | grep -Po 'i-\w+')
IP_ADDR=$(cat your_file | grep -Po '\d{1,3}(?:\.\d{1,3}){3}')
RegEx位于上述命令中的单引号之间。
答案 1 :(得分:1)
如果您需要awk
解决方案和位多样性,您可以使用以下命令:
iName=$(awk 'BEGIN{RS=";"}/^i-\w+/{print $1; exit}' inputFile)
ipAddress=$(awk 'BEGIN{RS=";"}/([0-9]{1,3}[\.]){3}[0-9]{1,3}/{print $1; exit}' inputFile)
echo $iName
echo $ipAddress
<强>输出:强>
的i-03ghijklmn345 192.186.40.255
<强>解释强>
BEGIN{RS=";"}
您将;
定义为记录分隔符/^i-\w+/{print $1; exit}
当您到达i-name时,它将被打印,该过程将在此时停止,并且不会继续分析输入字符串 /([0-9]{1,3}[\.]){3}[0-9]{1,3}/{print $1; exit}
以相同的方式提取IP地址。 inputFile
。如果要将其放在一个变量中,请使用以下awk
命令:
$ awk 'BEGIN{RS=";"}/^i-\w+/{printf $1;}/([0-9]{1,3}[\.]){3}[0-9]{1,3}/{print ";"$1;exit}' inputFile;
i-03ghijklmn345;192.186.40.255
<强>试验:强>
答案 2 :(得分:1)
考虑到你的模式,第一个字段是某种id,因此id不适合包含星号(*
)。此外,IP地址始终包含在星号(*
)之间。在这种情况下,awk
下面也会有所帮助。
$ cat 48437686
i03ghijklmn345;abc;xyz;pqr;null;abc;null;null;null;disabled;/dev/sda1;abc;abc: User initiated shutdown;abc;abc;vpc-abc;**192.186.40.255**;abc /dev/sda1 vol-abc 2017-15-14T12:04:17.000z
$ awk -v RS=";" 'BEGIN{oldORS=ORS}NR==1 || /^\*\*.*\*\*$/{gsub(/*/,"");ORS=NR==1?";":oldORS;print}' 48437686
i03ghijklmn345;192.186.40.255
答案 3 :(得分:1)
用awk。将输入和输出字段分隔符设置为;
并打印第1列和第17列:
awk 'BEGIN{FS=OFS=";"} {print $1,$17}' file
输出:
i-03ghijklmn345;192.186.40.255