yae*_*ael 8 grep bash sed awk shell-script
下面的语法应该匹配“Ambari Server running”,但是如果单词之间有多个空格,如何匹配?如何忽略单词之间的空格?
echo "Ambari Server running" | grep -i "Ambari Server running"
echo "Ambari Server running" | grep -i "Ambari Server running"
echo " Ambari Server running" | grep -i "Ambari Server running"
Run Code Online (Sandbox Code Playgroud)
预期的结果应该是:
Ambari Server running
Ambari Server running
Ambari Server running
Run Code Online (Sandbox Code Playgroud)
使用tr它的-s选项将连续空格压缩成单个空格,然后压缩grep结果:
$ echo 'Some spacious string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string
Run Code Online (Sandbox Code Playgroud)
然而,这不会完全去除侧翼空间,只会将它们压缩成两端的单个空间。
使用sed去除侧翼空白以及压缩内部空白,以单个空格:
$ echo 'Some spacious string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string
Run Code Online (Sandbox Code Playgroud)
然后可以将其传递给grep.
使用 Regex 运算符+来指示一个或多个前面的标记,在本例中为空格。所以模式是\+:
echo "Ambari Server running" | grep -i "Ambari \+Server \+running"
Run Code Online (Sandbox Code Playgroud)
[:blank:]如果您不确定,我建议使用字符类来匹配任何水平空格,而不仅仅是普通空格:
echo "Ambari Server running" | grep -i "Ambari[[:blank:]]\+Server[[:blank:]]\+running"
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您只想在单词之间保留一个空格,请使用awk:
echo "Ambari Server running" | \
awk '$1=="Ambari" && $2=="Server" && $3=="running" {$1=$1; print}'
Run Code Online (Sandbox Code Playgroud)
$1=="Ambari" && $2=="Server" && $3=="running" 匹配所需的三个字段
{$1=$1} 用空格作为新的分隔符重建记录
{print} 打印记录