我有一个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
我愿意使用grep
,awk
,sed
我试图通过使用以下命令来完成我的任务,但它给了我整行:
grep -oE 'i-.*'<<<$variable
有什么帮助吗?
答案 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;之后的所有字母和数字字符。