如何解决如何在shell脚本中剪切grep输出的必需部分
我有一个如下的脚本
cdsw status|grep db-*|while read -r line ; do
echo "Processing $line"
# your code goes here
done
输出如下:
Processing | db-86bbb69b54-p7hxm | 1/1 | Running | 3 | 2020-09-11 15:36:31+00:00 | 100.66.0.7 | 10.12.33.88 | db |
Processing | db-migrate-9f61bb1-dbgjm | 0/1 | Succeeded | 0 | 2020-09-11 15:36:32+00:00 | 100.66.0.5 | 10.12.33.88 | db-migrate
如何在上述shell脚本中实现逻辑,以便仅从上述grep输出中获取值db-86bbb69b54-p7hxm
?
解决方法
使用以下任一Perl内衬:
# More robust,assuming the fields are separated by whitespace and pipe:
perl -F'\s*[|]\s*' -lane 'print $F[1]'
# Simpler,assuming the first two fields have no whitespace:
perl -lane 'print $F[2]'
例如:
cdsw status|grep db-*|while read -r line ; do
echo "Processing $line"
db=$( perl -F'\s*[|]\s*' -lane 'print $F[1]' <<< ${line} )
echo "Processing db=${db}"
done
Perl单行代码使用以下命令行标志:-e
:告诉Perl在代码中而不是在文件中查找代码。-n
:一次遍历输入一行,默认情况下将其分配给$_
。-l
:在直接执行代码之前,先剥离输入行分隔符(默认为* NIX上的"\n"
),并在打印时附加它。
-a
:在空白或$_
选项中指定的正则表达式上,将@F
拆分为数组-F
。
另请参见: perldoc perlrun
: how to execute the Perl interpreter: command line switches
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。