之前,我需要打印一列的匹配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)是一行上的第一个单词时,这将跳过匹配。 –