awk 和 cut with grep 之间的确切区别是什么?

Nid*_*dal 36 performance grep awk cut

我们知道我们可以使用这两种技术从文件中获取我们想要的行的第二列:

awk '/WORD/ { print $2 }' filename
Run Code Online (Sandbox Code Playgroud)

或者

grep WORD filename| cut -f 2 -d ' '
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 上面两个命令有什么区别?
  • 哪个性能最好?
  • usingawk与 using相比有什么优势,cut反之亦然?
  • 什么选择awk给了我们cut,反之亦然?

Dub*_*ubu 43

两行之间最显着的区别取决于输入。cut将单个字符 in-d作为字段分隔符(默认为 TAB),并且该字符的每次出现都会开始一个新字段。awk,但是更灵活。分隔符在FS变量中,可以是空字符串(每个输入字符构成一个单独的字段)、单个字符或正则表达式。单个空格字符的特殊情况(默认)意味着在任何空格序列上进行拆分。此外,awk默认情况下禁止前导空格。

请比较:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def
Run Code Online (Sandbox Code Playgroud)

在这里,awkabc和之间的空格序列上进行拆分,defcut将每个空格作为分隔符。

你采取什么取决于你想要达到的目标。否则,我希望cut更快,因为它是一个较小的、单一用途的工具,但awk有自己的编程语言。

  • `cut` 可能比 Awk *alone* 快,但是`grep ... | cut` 将比纯 awk 更快。 (4认同)

Gil*_*il' 11

一般来说,工具越专业,速度就越快。因此,在大多数情况下,您可以期望cut并且grep比 快sed,并且sed比 快awk。如果您将更长的更简单工具的管道与更复杂工具的单次调用进行比较,则没有经验法则。这只对大输入(例如,数百万行)很重要;对于简短的输入,您不会看到任何区别。

更复杂的工具的优势当然是它们可以做更多的事情。

你的命令不必要地使用 cat 。改用重定向(特别是如果您担心速度,尽管在运行基准测试之前您可能不应该担心速度¹)。

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '
Run Code Online (Sandbox Code Playgroud)

这些命令几乎是等效的。区别在于:

  • awk 和 grep 有不同的正则表达式语法。awk 并grep -E具有几乎相同的正则表达式语法(扩展正则表达式)。
  • cut -d ' '将每个单独的空格字符视为分隔符。awk 的默认分隔符是任何空格序列,可以是多个空格、制表符等。您不能使用任意空格序列作为分隔符cut。要在 awk 中使用单个空格作为分隔符,请将字段分隔符设置为匹配单个空格的正则表达式,而不是由单个空格组成的正则表达式(这是一种特殊情况,表示“任何空格序列”,即默认值):awk -F '[ ]' '/WORD/ {print $2}'

¹程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅限专家!):先不要这样做。迈克尔·A·杰克逊