2015-10-30 126 views
0

我在想,如果有人能帮助我简化shell命令为一个或两行首次和最后出现,我们就可以用awk或sed的,以简化执行,在执行过程中更好的性能被大大appriciated搜索的多模式

输入文件

PATTERN1 xxx 
    PATTERN2 xxx 
    PATTERN3 xxx 
    PATTERN1 yyy 
    PATTERN2 yyy 
    PATTERN3 yyy 
    PATTERN1 zzz 
    PATTERN2 zzz 
    PATTERN3 zzz 

我的脚本:

echo "First occurance..." 
    grep -m1 "PATTERN1" $fileName 
    grep -m1 "PATTERN2" $fileName 
    grep -m1 "PATTERN3" $fileName 

    echo "Last occurance..." 
    tac $fileName | grep -m1 "PATTERN1" 
    tac $fileName | grep -m1 "PATTERN2" 
    tac $fileName | grep -m1 "PATTERN3" 

输出

PATTERN1 xxx 
    PATTERN2 xxx 
    PATTERN3 xxx 
    PATTERN1 zzz 
    PATTERN2 zzz 
    PATTERN3 zzz 

在此先感谢

回答

0

只需两个命令:

$ awk '/PATTERN[1-3]/ && !seen[$1]++' file 
    PATTERN1 xxx 
    PATTERN2 xxx 
    PATTERN3 xxx 

$ tac file | awk '/PATTERN[1-3]/ && !seen[$1]++' 
    PATTERN3 zzz 
    PATTERN2 zzz 
    PATTERN1 zzz 

此打印比赛第一次看到。

0

如果要继续使用grep,可以使用xargs。在一个变量

patterns=`echo "PATTERN"{1..3} | tr ' ' '\n'` 
# or 
patterns="PATTERN1\nPATTERN1\nPATTERN3" 

,让我们把图案所以,现在,我们可以做这样的事情:

echo -e "$patterns" | xargs -l sh -c 'cat '$inputFile' | grep -m1 "$0"' 
echo -e "$patterns" | xargs -l sh -c 'tac '$inputFile' | grep -m1 "$0"'