2017-04-02 61 views
0

之前,我需要打印一列的匹配Protectedfor52weeks或Protectedfor365days后留下的价值。下面是我的线grep的特定字符串,并打印一列匹配

completed Protectedfor52weeks failed Protectedfor365days 

对于上面行所希望的输出是如下

completed failed 
+0

最简单的答案是读取线到一个数组例如'line =“已完成Protectedfor52wweks Protectedfor365days failed”; array =($ line); for((i = 0; i <$ {#array [@]}; i ++));做,如果[[($ {阵列[I]} == Protectedfor52weeks || $ {阵列[I]} == Protectedfor365days)&&我-lt $(($ {#阵列[@]} - 1))]];然后echo $ {array [$((i + 1))]};网络连接; done' –

+0

是它总是以相同的顺序,'Protectedfor52weeks'先走,然后'Protectedfor365days'? – RomanPerekhrest

+0

如果你不需要在同一行上有“完成”和“失败”,你可以使用grep -Eo“[^] * Protectedfor(52weeks | 365days)”x2 |剪下-d“”-f1'。当特定字符串(Protectedfor52week)是一行上的第一个单词时,这将跳过匹配。 –

回答

1

grep的与先行

grep -oP '\S+\s(?=Protectedfor(52weeks|365days))' file 

检查任一者或所有线路上的两个匹配。

+0

现在我喜欢这样的解决方案(即使它需要POSIX正则表达式)。 –

+0

@ DavidC.Rankin你的意思'-P'为POSIX?因为'-P'的意思是使用'PCRE'正则表达式或者你突出显示其他东西? – Sundeep

+0

是的,是我不好,Perl兼容的正则表达式':)' –

0

从注释继续,而你可以用grep扩展的正则表达式做匹配,或者与sed恢复参照,简单的方法是将其读入一个数组,并简单地测试你遍历在阵列:

#!/bin/bash 

line="completed Protectedfor52weeks failed Protectedfor365days" 

array=($line) 

for ((i = 0; i < ${#array[@]}; i++)); do 
    if [[ (${array[i]} == Protectedfor52weeks || \ 
    ${array[i]} == Protectedfor365days) && \ 
    $i -lt $((${#array[@]} - 1)) ]]; then 
     echo ${array[$((i+1))]} 
    fi 
done 

实施例使用/输出

$ bash weeks.sh 
failed 
0

awk;遍历字段和之前的任何的期望的话打印字段:

awk '{for(i=1; i<=NF; ++i) if ($i ~ /^Protectedfor(52weeks|365days)$/) print $(i-1)}' 

实施例:

% awk '{for(i=1; i<=NF; ++i) if ($i ~ /^Protectedfor(52weeks|365days)$/) print $(i-1)}' <<<'completed Protectedfor52weeks failed Protectedfor365days' 
completed 
failed 
相关问题