String 列出文件名,不包括使用grep的两个字符串

String 列出文件名,不包括使用grep的两个字符串,string,bash,grep,String,Bash,Grep,我有一个文件夹,里面有很多wsdl。我想找出哪些WSDL不包含字符串“binding style=“document”“”binding style=“rpc”。 我已经尝试过遵循grep命令,但它不起作用,我猜是因为它检查与与否 grep -Ev 'binding style=\"rpc\"|binding style=\"document\"' -l folder/* | cut -f2 -d'/' 使用单引号时,不必引用“: 要使文件不包含模式,请执行以下操作: awk 'BEGIN {

我有一个文件夹,里面有很多wsdl。我想找出哪些WSDL不包含字符串“binding style=“document”“”binding style=“rpc”。 我已经尝试过遵循grep命令,但它不起作用,我猜是因为它检查与与否

grep -Ev 'binding style=\"rpc\"|binding style=\"document\"' -l folder/* | cut -f2 -d'/'

使用单引号时,不必引用

要使文件不包含模式,请执行以下操作:

awk 'BEGIN {
    for (i = 1; i < ARGC; ++i) {
        m = 0
        file = ARGV[i]
        while ((getline line < file) > 0) {
            if (line ~ /binding style="rp"|binding style="document"/) {
                m = 1
                break
            }
        }
        close(file)
        if (m == 0) {
            print file
        }
    }
    exit
}' folder/* | cut -f2 -d'/'
awk'开始{
对于(i=1;i0){
if(line~/binding style=“rp”| binding style=“document”/{
m=1
打破
}
}
关闭(文件)
如果(m==0){
打印文件
}
}
出口
}'文件夹/*|剪切-f2-d'/'
单行命令:

awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){print file}}exit}' folder/* | cut -f2 -d'/'
awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){sub(/.*\//,"",file);print file}}exit}' folder/*
awk'BEGIN{for(i=1;i0){
if(line~/binding style=“rp”| binding style=“document”/{
m=1
打破
}
}
关闭(文件)
如果(m==0){
子(/.\/,“”,文件)
打印文件
}
}
出口
}'文件夹/*
您不再需要使用cut

单行命令:

awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){print file}}exit}' folder/* | cut -f2 -d'/'
awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){sub(/.*\//,"",file);print file}}exit}' folder/*

awk'BEGIN{for(i=1;i使用单引号时,您不必引用

要使文件不包含模式,请执行以下操作:

awk 'BEGIN {
    for (i = 1; i < ARGC; ++i) {
        m = 0
        file = ARGV[i]
        while ((getline line < file) > 0) {
            if (line ~ /binding style="rp"|binding style="document"/) {
                m = 1
                break
            }
        }
        close(file)
        if (m == 0) {
            print file
        }
    }
    exit
}' folder/* | cut -f2 -d'/'
awk'开始{
对于(i=1;i0){
if(line~/binding style=“rp”| binding style=“document”/{
m=1
打破
}
}
关闭(文件)
如果(m==0){
打印文件
}
}
出口
}'文件夹/*|剪切-f2-d'/'
单行命令:

awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){print file}}exit}' folder/* | cut -f2 -d'/'
awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){sub(/.*\//,"",file);print file}}exit}' folder/*
awk'BEGIN{for(i=1;i0){
if(line~/binding style=“rp”| binding style=“document”/{
m=1
打破
}
}
关闭(文件)
如果(m==0){
子(/.\/,“”,文件)
打印文件
}
}
出口
}'文件夹/*
您不再需要使用cut

单行命令:

awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){print file}}exit}' folder/* | cut -f2 -d'/'
awk 'BEGIN{for(i=1;i<ARGC;++i){m=0;file=ARGV[i];while((getline line<file)>0){if(line ~ /binding style="rp"|binding style="document"/){m=1;break}}close(file);if(m==0){sub(/.*\//,"",file);print file}}exit}' folder/*

awk'BEGIN{for(i=1;i您可以使用
awk
而不是
grep
,因为它允许您将正则表达式匹配与逻辑运算符组合:

要打印具有两个匹配项的行,请执行以下操作:

$ awk '$0~s1 && $0~s2' s1='binding style="rpc"' s2='binding style="document"'  
要打印至少有一个匹配项的行,请执行以下操作:

$ awk '$0~s1 || $0~s2' s1='binding style="rpc"' s2='binding style="document"'  
$ awk '$0~s1 || $0~s2{print FILENAME;nextfile}'
打印既不匹配也不匹配的行的步骤

$ awk '!($0~s1 || $0~s2)' s1='binding style="rpc"' s2='binding style="document"'

要仅打印文件名,您可以使用
GNU awk
对单行中包含两个匹配项的文件执行以下操作:

$ awk '$0~s1 && $0~s2{print FILENAME;nextfile}'
至少包含一个匹配项的文件:

$ awk '$0~s1 || $0~s2' s1='binding style="rpc"' s2='binding style="document"'  
$ awk '$0~s1 || $0~s2{print FILENAME;nextfile}'
跨任意行包含两个匹配项的文件:

$ awk '$0~s1{f1=1} $0~s2{f2=1}ENDFILE{if (f1&&f2) print FILENAME;f1=f2=0}'
不包含匹配项的文件:

$ awk '$0~s1{f1=1} $0~s2{f2=1}ENDFILE{if (!(f1||f2)) print FILENAME;f1=f2=0}'
您仍然需要添加
s1
s2
的定义,我只是为了保持行的简短易读性而省略了它们。我选择在脚本之后定义
s1
s2
的原因是字符串包含双引号,这样做可以避免任何令人讨厌的转义。如果您有匹配项而没有你可以做些简单的事情:

$ awk '/foo/ && /bar/{print FILENAME;nextfile}' folder/* | basename

对于字符串
foo
bar
等…

您可以使用
awk
而不是
grep
,因为它允许您将正则表达式匹配与逻辑运算符相结合:

要打印具有两个匹配项的行,请执行以下操作:

$ awk '$0~s1 && $0~s2' s1='binding style="rpc"' s2='binding style="document"'  
要打印至少有一个匹配项的行,请执行以下操作:

$ awk '$0~s1 || $0~s2' s1='binding style="rpc"' s2='binding style="document"'  
$ awk '$0~s1 || $0~s2{print FILENAME;nextfile}'
打印既不匹配也不匹配的行的步骤

$ awk '!($0~s1 || $0~s2)' s1='binding style="rpc"' s2='binding style="document"'

要仅打印文件名,您可以使用
GNU awk
对单行中包含两个匹配项的文件执行以下操作:

$ awk '$0~s1 && $0~s2{print FILENAME;nextfile}'
至少包含一个匹配项的文件:

$ awk '$0~s1 || $0~s2' s1='binding style="rpc"' s2='binding style="document"'  
$ awk '$0~s1 || $0~s2{print FILENAME;nextfile}'
跨任意行包含两个匹配项的文件:

$ awk '$0~s1{f1=1} $0~s2{f2=1}ENDFILE{if (f1&&f2) print FILENAME;f1=f2=0}'
不包含匹配项的文件:

$ awk '$0~s1{f1=1} $0~s2{f2=1}ENDFILE{if (!(f1||f2)) print FILENAME;f1=f2=0}'
您仍然需要添加
s1
s2
的定义,我只是为了保持行的简短易读性而省略了它们。我选择在脚本之后定义
s1
s2
的原因是字符串包含双引号,这样做可以避免任何令人讨厌的转义。如果您有匹配项而没有你可以做些简单的事情:

$ awk '/foo/ && /bar/{print FILENAME;nextfile}' folder/* | basename

对于字符串
foo
bar
等…

这将打印不包含字符串的所有文件的文件名
binding style=“rp”
binding style=“document”

perl-le'for$f(@ARGV){$p=0;open($fh,$f);while(){$p++if(/binding style=“rp”| binding style=“document”/)}打印$f,除非$p;}*

我假设您需要文件名

这将打印不包含字符串的所有文件的文件名
binding style=“rp”
binding style=“document”

perl-le'for$f(@ARGV){$p=0;open($fh,$f);while(){$p++if(/binding style=“rp”| binding style=“document”/)}打印$f,除非$p;}*

我假设您希望文件名

grep“a | b”
是一个OR。若要获取AND,请执行
grep a | grep b
。是否可以通过指定文件夹来实现这一点?
grep-v a folder/*| grep-lv b
应该实现。关于和的逻辑是错误的。如果要排除行,则OR解决方案已经正确,因为
!(A | B)
=
(!A&&!B)
grep“A | B”
是一个OR。若要获取AND,请执行
grep A | grep B
。是否可以通过指定文件夹来执行此操作?
grep-v A folder/*| grep-lv B
应该执行此操作。关于和的逻辑是错误的。如果要排除行,则OR解决方案已经正确,因为
!(A | B)
=
(!A&&!B)
如何指定文件夹?与您使用
grep
的方法相同,通过使用shell globings传入所有文件
awk'$0~s1&$0~s2's1='binding style=“rpc”'s2='binding style=“document”'folder/*
。侧边提示:命令
basename
从文件中删除前导目录,以便您可以用
basename
替换
cut-f2-d'/'