Answers:
您的两行之间最明显的区别将取决于输入。cut
使用单个字符-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
在此,awk
按abc
和分隔空格,def
而cut
将每个空格作为分隔符。
您将采取什么取决于您想要实现的目标。否则,我希望cut
它会更快,因为它是一个较小的,单一目的的工具,但awk
具有自己的编程语言。
cut
可能会比单独的 Awk快,但并不确定grep ... | cut
会比纯Awk快。
一般来说,工具越专业,它的速度就越快。因此,在大多数情况下,您可以期望cut
和grep
比更快sed
,并且sed
比更快awk
。如果通过一次调用更复杂的工具来弥补更简单工具的较长管道,那就没有经验了。这仅与大输入(例如,数百万行)有关;对于简短的输入,您不会看到任何区别。
当然,更复杂的工具的优势在于它们可以做更多的事情。
您的命令不必要地使用cat。改用重定向(特别是如果您担心速度,尽管您可能不应该担心速度,直到运行基准测试¹)。
<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '
这些命令几乎是等效的。不同之处在于:
grep -E
具有几乎相同的regexp语法(扩展的正则表达式)。cut -d ' '
将每个单独的空格字符视为分隔符。Awk的默认定界符是任何空格序列,可以是多个空格,制表符等。您不能使用任意空格序列作为分隔符cut
。使用单个空格作为在AWK分离器,设置字段分隔符相匹配的单个的空间,比由单个空间(这是一种特殊情况,意思是“任何空白序列”,即,默认的)一个正则表达式的其他一个正则表达式:awk -F '[ ]' '/WORD/ {print $2}'
。¹ 程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅适用于专家!):暂时不要做。- 迈克尔·杰克逊
你的命令
cat fileName | awk '/WORD/ { print $2 }'
您甚至不需要cat
命令。您可以尝试,
awk '/WORD/ { print $2 }' filename
下面的命令将输出从cat重定向到grep,然后剪切:
cat fileName | grep WORD | cut -f 2 -d ' '
很可能我们必须避免输出重定向。Awk可以单行执行此工作,但是cut
需要一个grep
命令以仅获取包含特定单词的行,并根据分隔符空间打印列2。
如果切割失败,则可以用awk进行操作。
grep WORD filename
。
echo filename
还是cat filename
?