Awk 如何在循环使用两个文件或一个文件时在内部grep
在这个用例中,我试图列出s3中的一些键,并根据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
文件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可能会让它更快一些