2017-04-02 84 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