grep特定字符串并在匹配前打印一列

时间:2017-04-02 03:07:03

标签: bash grep

我需要在匹配Protectedfor52weeks或Protectedfor365days后打印剩下的一列的值。以下是我的行

completed Protectedfor52weeks failed Protectedfor365days

对于上述行,所需的输出如下

completed failed

3 个答案:

答案 0 :(得分:1)

grep with lookahead

integer64

检查所有行上的一个或两个匹配。

答案 1 :(得分: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

答案 2 :(得分: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