正则表达式从分隔的字符串中提取多个值

时间:2018-01-25 07:29:23

标签: regex awk

我想提取我的名字&来自以下字符串的 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

4 个答案:

答案 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地址。
  • 最后,您将结果分配给2个变量并显示其内容或使用它们执行任何操作。
  • 根据您的需要更改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

<强>试验:

enter image description here

答案 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