linux - bash 中的连字符和垂直线

标签 linux bash amazon-web-services ubuntu

我正在尝试破译以下代码:

awk '{print "aws s3 cp ###"$4" - | gunzip | awk -F $\"\\t\" '"'"'BEGIN {OFS = FS} {if ($287 == \"0\" && tolower($295)) print $11}'"'"' > "gensub(/.+\/(.+tsv\.gz)/,output_path"\\1.txt",$4)}'

但是,我不确定一些事情:

1) "-"的作用。我知道“|”用于管道,但我真的不确定“-”,除非在否定某些选项的情况下。我尝试用谷歌搜索“ubuntu hyphen/minus/dash”,但没有找到与此相关的内容

2) 我也不确定 print "aws s3 cp ###"$4"。它通常会打印满足 if 条件的行,但这里它需要一个 aws 命令字符串,后面是我知道 $4 是一个列索引

3) 另外,我知道 awk -F 后跟一个符号会将符号指定为分隔符,但这里没有符号。我不明白这种情况下的默认行为。

最佳答案

那真是一个糟糕的命令行。

1) 连字符是 aws s3 cp 命令的一个选项。以这种方式使用它并不常见,但这意味着副本的目标是 STDOUT,因此通过管道传输到 gunzip。更常见的是连字符代表 STDIN,用于将数据通过管道输入命令。

2) print 正在输出 aws s3 cp 命令以及管道的所有其余部分(包括另一个 AWK 命令的嵌入式实例)。

3) 此处 -F 的“符号”是制表符(不正确地)使用 Bash 的翻译引号 ($"")。它应该使用 Bash 的 ANSI 引号 ($' '),它允许解释反斜杠转义(\t 表示制表符)。无论如何,这都是浪费,因为 AWK 无需任何特殊引用即可理解 \t for -F

这似乎是一个必须在别处设置的变量:output_path

外部 AWK 命令输出的管道需要提供给 shell 才能执行。

关于linux - bash 中的连字符和垂直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316203/

相关文章:

linux - 为什么在初始化之前通过 LD_PRELOAD 操作加载库?

linux - bash 拼写错误,不知道错误是什么

c - 编程 MacOS-X 和 Linux API - POSIX 兼容?

regex - 在正则表达式匹配之间剪切输出的最有效方法?

linux - bash 测试范围内的数字(带 float )

amazon-web-services - 如何为AWS Lambda创建和压缩Docker容器

linux - 为什么这个 SED 命令不起作用?

node.js - Docker仅在构建后运行

amazon-web-services - 是否可以将 Dynamodb 表拆分为更多表(AWS)?

amazon-web-services - 来自 Ip 的 Docker AWS 访问容器