Awk 如何在循环使用两个文件或一个文件时在内部grep

Awk 如何在循环使用两个文件或一个文件时在内部grep,awk,sed,grep,Awk,Sed,Grep,在这个用例中,我试图列出s3中的一些键,并根据grep命令过滤结果 文件A-abc/def def/123 在列出这些键之后,我试图从列表中删除这个键。例如,if list返回两个具有相同前缀的其他键 清单-abc/def/123 abc/def/1234 abc/ghi/12345 def/123/456 def/456/4567 我想删除与从文件读取的模式匹配的键,即abc/def和def/123 代码: 读行时;做 前缀=$(回显“$line”| grep-oPw'[A-Za-z

在这个用例中,我试图列出s3中的一些键,并根据grep命令过滤结果


文件A-abc/def
def/123
在列出这些键之后,我试图从列表中删除这个键。例如,if list返回两个具有相同前缀的其他键


清单-abc/def/123
abc/def/1234
abc/ghi/12345
def/123/456
def/456/4567

我想删除与从文件读取的模式匹配的键,即
abc/def和def/123

代码:


读行时;做
前缀=$(回显“$line”| grep-oPw'[A-Za-z0-9]*')
aws s3api列表对象--bucket blah bucket--前缀“$prefix”| grep-vFfw“$line”>结果
完成

我收到此错误,未找到
命令:前缀


我在这个循环中遗漏了什么?

这是一个常见的问题,多年来一直在这里发布的各种问题中得到解决。:-)

您想要的符号应该更像这样:

prefix="$(echo ...)"
请记住,shell是一种shell,而不是一种真正成熟的编程语言。其解析规则旨在方便调用其他程序,并设置管道以允许这些程序相互交互

以下是Bourne族中的shell(sh、bash、ksh、zsh、ash/dash)解释错误放置的空间的各种方式。考虑:

var=val
var =val
var= val
var = val
  • var=val
    :这是变量assigment的正确语法——一个不带引号的单词,后跟一个等于,后跟一个参数
  • var=val
    :此命令以
    =val
    作为参数运行
    var
    命令
  • var=val
    :这将为
    var
    变量分配一个空字符串,然后运行
    val
    命令,就像
    var
    已导出到它一样。这意味着为shell调用的命令提供一次性环境变量
  • var=val
    :以
    =
    val
    作为参数运行
    var
    命令
其他(非伯恩风格或非POSIX)Shell将有不同的解释


此外,请注意,对于此循环的每次迭代,您都将覆盖文件
结果。

您有一个简单的语法错误。但是,如果我理解您所说的删除与从文件中读取的模式匹配的密钥的意思,那么您的工作太辛苦了

如果以下解决方案符合您的要求,我保证它会运行得更快,更容易理解:

$ head patterns input
==> patterns <==
abc/def
def/123

==> input <==
abc/def/123
abc/def/1234
abc/ghi/12345
def/123/456
def/456/4567

$ grep -vf patterns input
abc/ghi/12345
def/456/4567
$head模式输入

==>模式输入您还可以使用以下命令链:

$cat to_remove.in 
abc/def
def/123


$cat to_process.in 
abc/def/123
abc/def/1234
abc/ghi/12345
def/123/456
def/456/4567


$awk 'BEGIN{ORS="\\\\|"}{print}' to_remove.in | sed 's/\\|$//' | xargs -I {} grep -v {} to_process.in
abc/ghi/12345
def/456/4567
解释:

  • awk
    将用于从文件
    中创建一个正则表达式以删除。在
    中,grep-v将使用
    grep-v
    在每行之间创建一个带有
    的正则表达式,以从文件
    中排除要删除的行。在
  • sed的/\\\\\\\\\$/'
    用于删除正则表达式字符串末尾的最后一个
  • 然后使用
    xargs
    将生成的正则表达式字符串传递给
    grep
    命令

谢谢。删除空格后,它就工作了。++ve Ghoti先生,回答得很好。是的,如果你把所有输入都放在一个文件中,它就工作了。在我的例子中,我试图在运行中完成它。这对于静态输入也同样有效。我试着用while循环在飞行中完成它。虽然我认为使用xargs可能会让它更快一些