Shell 对于“;grep-b1&x201C;尽我所能’;t使用带-B的grep来获取o/p

Shell 对于“;grep-b1&x201C;尽我所能’;t使用带-B的grep来获取o/p,shell,unix,grep,Shell,Unix,Grep,MacOS上的我的grep不支持GNU grep的-B count选项。我需要以下命令的替代选项: while read x; do find . -name \*$x\* -exec cat {} + | grep -i -B 1 "failed with status" done < x -B for grep在while循环中也可以正常工作。请重新检查您的文件中的格式 cat boo a test line failed with statu

MacOS上的我的grep不支持GNU grep的
-B count
选项。我需要以下命令的替代选项:

while read x; do
    find . -name \*$x\* -exec cat {} + |
    grep -i -B 1 "failed with status"
done < x

-B for grep在while循环中也可以正常工作。请重新检查您的文件中的格式


 cat boo
a test line
failed with status
some random text


find . -name *b* -exec cat {} \; | grep -B 1 'failed with status'
a test line
failed with status

cat x
boo

while read x; do find . -name \*$x\* -exec cat {} + | grep -i -B 1 "failed with status" ;done < x
a test line
failed with status


猫咪
试车线
失败,状态为
一些随机文本
找到-名称*b*-exec cat{}\|grep-B 1“状态为失败”
试车线
失败,状态为
猫x
喝倒采
读x时;一定要找到-name\*$x\*-exec cat{}+|grep-i-b1“状态失败”;完成
试试
awk

find . -name "*$x*" -exec cat {} + |
awk 'length(prev) != 0 && tolower($0) ~ /failed with status/{ print prev; print } { prev=$0 }'
我想也是
sed

sed -n '1{h;b;}; H; y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/; /failed with status/{ x; p; s/.*//; n; h; b; }; x; s/[^\n]*\n//; x'

在评论中,您提到了问题的两条重要线索:

  • 您似乎在服务器上运行该命令(请参阅)

    这将是不可能的,因为我在没有根访问权限的服务器主机上运行这个

  • 您提到了以下错误(请参阅):

    grep:非法选项--B用法:grep[-c |-l |-q]-bhinsvw模式文件

  • 这使我相信,您不是在OSX上运行命令,而是在HP-UNIX上运行命令。查看显示此版本不支持GNU grep扩展

    您可以使用awk模拟
    -i-B count
    选项:

    awk -v c=count -v s="failed with status" '
            BEGIN{c=c+1}{a[FNR%c]=$0}
            (tolower($0) ~ s){
               for(i=(FNR>c)*(FNR-c)+1;i<=FNR;++i) print a[i%c]; print "--"
            }'
    

    可以将循环简化为单个
    awk
    (standadr Linux awk/gawk)命令,如下所示:

    while read x; do
        awk 'BEGINFILE{l = ""} /failed with status/{print FILENAME": "l RS $0}{l = $0}' $(find -name "*$x*")
    done < x
    
    awk
    脚本说明
    错误:grep:非法选项--B用法:grep[-c |-l |-q]-bhinsvw模式文件。请将您的评论中的信息移动到问题中。完成-B1和-B1都被试过,但有点相同。请将前两条评论中的信息移到问题中。您提到您在服务器上运行此操作系统,服务器的操作系统是什么?@Misrtyvib我已编辑了我的答案。我怀疑一定有一些非空白字符“B”和grep。手动输入整个grep命令怎么样?也许他的grep不支持-B?最好了解操作系统.OS-macOSMojave@Jens-B选项未在man grep下预设…这对我来说是一场灾难…有其他选择吗?@Misrtyvib check Sed不起作用-只有AWk可以工作-我猜如何添加前5行-这不是标准的AWk,而是一个简单的GNU AWk,它包含扩展。由于OP表明他不能使用GNU grep,因此他是否能使用GNU awk似乎值得怀疑。这也没有给出相同的预期结果。这会重置每个文件的所有内容,而OP只希望看到所有文件组合的cat输出。这两个注释都是正确的
    gawk
    是Linux机器中的标准配置。并在每个文件上重置测试。用户可以删除节
    BEGIN{l=”“}
    ,其行为类似于单个文件的
    cat
    。@Misrtyvib我已经更新了脚本。如果它不起作用,你的脚本就会有问题。
    awk '(tolower($0)~/failed with status/){print (FNR>1?p ORS:"") $0}{p=$0}'
    
    while read x; do
        awk 'BEGINFILE{l = ""} /failed with status/{print FILENAME": "l RS $0}{l = $0}' $(find -name "*$x*")
    done < x
    
    while read x; do
        awk 'BEGINFILE{l = ""} /[fF][aA][iI][lL][eE][dD] [wW][iI][tT][hH] [sS][tT][aA][tT][uU][sS]/{print FILENAME": "l RS $0}{l = $0}' $(find -name "*$x*")
    done < x
    
    BEGINFILE {previusLine = ""} # On file reading start, reset variable previusLine
    /failed with status/         # On lines mathching regex pattern "failed with status"
    {
                                 # print filename prefix + previousLine + newline + current line
      print FILENAME ": " previusLine RS $0;
    } 
    {                            # On each line
      previusLine = $0;          # save the current line into variable previusLine
    }