之前,我需要打印一列的匹配Protectedfor52weeks或Protectedfor365days後留下的價值。下面是我的線grep的特定字符串,並打印一列匹配
completed Protectedfor52weeks failed Protectedfor365days
對於上面行所希望的輸出是如下
completed failed
之前,我需要打印一列的匹配Protectedfor52weeks或Protectedfor365days後留下的價值。下面是我的線grep的特定字符串,並打印一列匹配
completed Protectedfor52weeks failed Protectedfor365days
對於上面行所希望的輸出是如下
completed failed
grep的與先行
grep -oP '\S+\s(?=Protectedfor(52weeks|365days))' file
檢查任一者或所有線路上的兩個匹配。
現在我喜歡這樣的解決方案(即使它需要POSIX正則表達式)。 –
@ DavidC.Rankin你的意思'-P'爲POSIX?因爲'-P'的意思是使用'PCRE'正則表達式或者你突出顯示其他東西? – Sundeep
是的,是我不好,Perl兼容的正則表達式':)' –
從註釋繼續,而你可以用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
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
最簡單的答案是讀取線到一個數組例如'line =「已完成Protectedfor52wweks Protectedfor365days failed」; array =($ line); for((i = 0; i <$ {#array [@]}; i ++));做,如果[[($ {陣列[I]} == Protectedfor52weeks || $ {陣列[I]} == Protectedfor365days)&&我-lt $(($ {#陣列[@]} - 1))]];然後echo $ {array [$((i + 1))]};網絡連接; done' –
是它總是以相同的順序,'Protectedfor52weeks'先走,然後'Protectedfor365days'? – RomanPerekhrest
如果你不需要在同一行上有「完成」和「失敗」,你可以使用grep -Eo「[^] * Protectedfor(52weeks | 365days)」x2 |剪下-d「」-f1'。當特定字符串(Protectedfor52week)是一行上的第一個單詞時,這將跳過匹配。 –