搜索变量中实例ID的所有出现

时间:2018-03-09 02:42:26

标签: bash awk grep

我有一个bash变量,其中包含以下内容:

SSH exit status 255 for i-12hfhf578568tn
i-12hdfghf578568tn is able to connect
i-13456tg is not able to connect
SSH exit status 255 for 1.2.3.4 

我想搜索以i-开头的字符串,然后只提取该实例ID。所以,对于上面的输入,我想要输出如下:

i-12hfhf578568tn
i-12hdfghf578568tn
i-13456tg

我愿意使用grepawksed 我试图通过使用以下命令来完成我的任务,但它给了我整行:
grep -oE 'i-.*'<<<$variable
有什么帮助吗?

3 个答案:

答案 0 :(得分:3)

您只需将grep命令更改为:

即可
grep -oP 'i-[^\s]*' <<<$variable

根据您的输入进行测试:

$ cat test 
SSH exit status 255 for i-12hfhf578568tn
i-12hdfghf578568tn is able to connect
i-13456tg is not able to connect
SSH exit status 255 for 1.2.3.4

$ var=`cat test`

$ grep -oP 'i-[^\s]*' <<<$var                                                                                                                  
i-12hfhf578568tn
i-12hdfghf578568tn
i-13456tg

grep正是您完成此任务所需要的,如果您必须重新格式化输入,sed会更合适,如果您要重新格式化字符串,awk会更好或者对行,列

中的某些字段进行一些计算

<强>解释

  • -P将使用perl regex
  • i-[^\s]*是一个正则表达式,与字面上的i-后跟0到N非空格字符匹配,如果您想强加*,可以将+更改为- {min,max}之后至少有1个字符,或者您可以使用grep -oP 'i-\S*' <<<$var 语法来强加范围。

如果有什么不清楚的地方,请告诉我。

加成:

根据Sundeep的评论,您可以使用我提出的正则表达式的改进版本之一(第一个使用PCRE,第二个使用posix正则表达式):

grep -o 'i-[^[:blank:]]*' <<<$var

seaborn

答案 1 :(得分:2)

您也可以使用以下内容(我使用GNU awk进行了测试):

echo "$var" | awk -v RS='[ |\n]' '/^i-/'

答案 2 :(得分:1)

您也可以使用此代码(在unix中测试)

echo $test | grep -o "i-[0-z]*"

下面,
-o#仅打印行的匹配部分
i- [0-z] *#这个正则表达式匹配&#39; i - &#39;之后的所有字母和数字字符。