sed、grep、find、awk、gawk之间有什么关系?哪个更受推荐?

10

我是Linux/Unix的新手。我发现有些任务可以使用多种命令完成。它们之间是否存在关联?哪一个更受青睐?哪一个已经过时?

谢谢。


1
难道没有一个Unix用户的StackExchange网站,你可以在那里问这样的问题吗? - Gabe
3
@Gabe: 这是一个在Stack Overflow上完全合适的问题 - 它与编程有关,而且问题是关于哪些命令对shell编程中的哪些部分有用。 - Jonathan Leffler
Jonathan: 当然,你可以认为计算机上的几乎任何事情都是一个编程任务。我只是认为,既然这是一个“描述工具”的问题,而不是一个“如何解决这个问题”的问题,它可能会在一个专门的Unix网站上得到更好的答案。 - Gabe
1
@Gabe:这里会有很多好的答案 - 有Unix程序员会提供它们。这不是一个仅限于Windows的网站! - Jonathan Leffler
Jonathan:我认为像“它们之间的关系是什么?”和“哪一个更好?”这样的问题对于这个网站的标准来说太笼统或主观了。如果问题是“C、C++、C#”或“vi、emacs、IDE”,那么我也会说同样的话,因为它们更具程序员特定性。 - Gabe
5个回答

12
请参阅SO 366980以了解Perl、Python、Awk和Sed之间的区别讨论。
在这个列表中有四个不同的命令,其中awk和gawk是密切相关的,GNU Awk是Awk的GNU实现。
  • find用于基于文件特征(如名称或修改时间)在一组目录中查找文件。 GNU Find比传统或POSIX版本的Find具有更多功能。

  • grep用于使用正则表达式控制选定内容在文件中查找内容。 GNU Grep比传统或POSIX版本的Grep具有更多功能。

  • sed用于使用编辑命令(包括正则表达式)修改文件内容。 GNU Sed比传统或POSIX版本的Sed具有更多功能。

  • awk是一种模式匹配和格式化语言。从某种程度上说,它是一种编程语言,而其他工具则不是。需要时,它非常有用。但是,Perl和Python也具有Awk的功能和许多额外功能,因此许多人使用它们来代替Awk。 GNU Awk比传统或POSIX版本的Awk具有更多功能。

因此,您列出的工具执行不同的任务,但可以以许多方式共同使用。您应该了解的另一个工具是xargs,它接受文件列表并依次在每个文件上运行指定的命令。

1
不错。其他对于shell使用有用的工具可能包括exprtestsort/uniq/comm/join/cut/paste等等... - ephemient

5
AWK是由Aho、Weinberger和Kernighan设计的编程语言。其中一个实现AWK的工具是gawk,但还有其他几个实现,包括mawk和nawk。它是一种完整的编程语言,带有变量、控制结构和关联数组,但通常优化用于处理在UNIX系统上常见的基于文本的数据。
sed是流编辑器,受到编辑器ed的启发。它具有简单的命令集,大多限于逐行编辑。sed命令可以轻松地在awk中模拟。以下是等价的:
sed -e 's/foo/bar/g'
awk '{ gsub(/foo/, "bar"); print $0 }'
awk '{gsub(/foo/,"bar")}1'

grep 查找文本。基本的 grep 功能可以很容易地在 sedawk 中模拟。以下两者等价:

grep 'foo.bar'
sed -n -e '/foo.bar/p'
awk '/foo.bar/ { print $0 }'
awk '/foo.bar/'

糟糕,错过了find命令。

find命令可以遍历文件系统树,并根据指定的条件执行相应的操作。例如:

find . -name '.*' -prune -o ! -name '*~' -type f -exec cat '{}' \;

从当前目录.开始遍历所有文件和目录,排除(不进入)任何以.开头的目录,并在每个文件名不以~结尾的文件上运行cat命令(打印出该文件的内容)。虽然AWK、Perl或其他编程语言(甚至是纯shell,在本例中)也可以完成此操作,但使用专门的工具更容易编写和理解,而且速度更快。请注意,html标签已保留。

4
不同的工具适用于不同的工作。问题就像“什么是更好的工具:锤子、螺丝刀还是组合钳?”
grep - 在文件/流中查找/过滤文本。行匹配/不匹配-将其流式传输到输出。用于减少输出量到您需要的内容。通常在交互式使用时,如果您得到了太多信息,也经常在脚本中使用以提取“包含我所需内容的那一行”。
通常,在grep的脚本使用之后,您会看到awk(复杂的表达式或老派程序员)或cut(速度更快但相当简单)来提取一个值。(grep水平剖分,cut/awk垂直剖分)
目前几乎没有人使用awk进行全功能编程。
sed - 查找和替换,通常是脚本化的(如果您想要交互式地执行此操作,则可视化编辑器更好-您可以看到正在执行的操作。)
find - 查找符合给定(高级)参数的文件。

3

这些工具的功能不同,所以首选取决于你想要做什么。

在你提到的工具中,find 和其他工具略有不同 -- 它可以在文件系统上搜索具有某些属性(名称、日期、权限等)的文件。

sedgrep 以文本文件作为输入,对其进行操作并输出结果。它们都广泛使用正则表达式。sed("流编辑器")通常用于搜索和替换操作。grep("全局正则表达式打印")输出与某个模式匹配的文本文件中的行。

在Linux系统上,awkgawk 通常是同一个程序的不同名称,即GNU版本的AWK(以其创建者"Aho, Weinberger, Kernighan"命名)。awk 还可以指"经典"版本的 awk,它没有GNU扩展,并且还有其他变体 nawk ("新awk")和 mawk ("Mike's AWK")。awk 的功能远远超出了模式匹配; 它实际上是一种完整的编程语言,尽管它是针对将输入文本分解为行和字段并对其进行操作(包括数字运算,因此很容易做到诸如总列或进行统计计算之类的事情)。


2
按我使用频率排序,附带注释。如需更多详细信息,请尝试在命令行中使用man command,例如man grep
grep - 打印与模式匹配的行 * 我个人认为这是最有用的。
grep foo *.txt
grep 192.168.1.1 output.log
grep -i steve */*.txt 

find - 遍历文件层次结构 * 可用于在子目录中查找文件或在文件上执行 shell 命令

find . -name lost.txt -print
find . -name "*.txt" -print
find . -type f -exec chmod 0644 {} \;

sed - 流编辑器 * 可以帮助自动化批量文件上的简单文本编辑

sed "s/abc/ABC/" foo.txt

awk - 模式匹配扫描和处理语言*很久没用了。如果需要使用awk,通常会使用类似Ruby的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接