【问题标题】:What's the relationship between sed, grep, find, awk, gawk, which one is preferred?sed、grep、find、awk、gawk是什么关系,首选哪个?
【发布时间】:2011-05-28 16:31:26
【问题描述】:

我是 Linux/Unix 新手。我发现使用这些命令可以通过多种方式完成一些任务。他们之间有什么关系吗?或者哪个更受欢迎?哪个过时了?

谢谢。

【问题讨论】:

  • 难道没有 Unix 用户 stackexchange 网站可以提出这样的问题吗?
  • @Gabe:这对 SO 来说是一个非常好的问题 - 这是关于编程的,问题是关于哪些命令对 shell 编程的哪些部分有用。
  • Jonathan:当然,您可以将计算机中的几乎所有内容都视为编程任务。我只是想,因为这是一个“描述工具”类型的问题,而不是“我该如何解决这个问题?”类型的问题,它可能会在专门的 Unix 网站上得到更好的答案。
  • @Gabe:它会在这里得到很多好的答案——周围有 Unix 程序员会提供这些答案。这不是一个仅限 Windows 的网站!
  • Jonathan:我只是觉得像“它们之间的关系是什么?”这样的问题。和“哪个是首选?”对于本网站的标准来说过于笼统或主观。如果问题是“C、C++、C#”或“vi、emacs、IDE”,我会说同样的话,而且这些问题更特定于程序员。

标签: linux unix command-line command


【解决方案1】:

AWK 是由 Aho、Weinberger 和 Kernighan 设计的一种编程语言。 gawk 是 AWK 的一种实现,但还有其他几种实现,包括 mawknawk。它是一种成熟的编程语言,包含变量、控制结构和关联数组,但通常针对处理 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 987654340@(打印出该文件内容的结果)。同样,这在 AWK 或 Perl 或许多其他编程语言(在本例中甚至是纯 shell)中是可行的,但使用专用工具编写和理解更容易、更快。

【讨论】:

    【解决方案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 之类的东西。

    【讨论】:

      【解决方案3】:

      这些工具做不同的事情,所以首选哪一个取决于你想做什么。

      在您提到的工具中,find 与其他工具略有不同——它适用于文件系统以搜索具有特定属性(名称、日期、权限...)的文件。

      sedgrep 将文本文件作为输入,对其进行操作,并输出结果。他们都大量使用正则表达式。 sed(“流编辑器”)通常用于搜索和替换操作。 grep(“全局正则表达式打印”)在文本文件中输出与某些模式匹配的行。

      在 Linux 系统上,awkgawk 通常是同一个程序的不同名称,即 GNU 版本的 AWK(以其创建者“Aho、Weinberger、Kernighan”的名字命名)。 awk 也可以指没有 GNU 扩展的 awk 的“经典”版本,还有其他变体 nawk(“new awk”)和 mawk(“Mike's AWK”)。 awk 所做的远不止模式匹配;它确实是一门成熟的编程语言,尽管它旨在将输入文本分解为行和字段并对其进行操作(包括数字操作,因此很容易执行汇总列或进行统计计算等操作)。

      【讨论】:

        【解决方案4】:

        有关 Perl、Python、Awk 和 Sed 之间差异的讨论,请参阅 SO 366980

        五个命令列表中有四个不同的命令; awk 和 gawk 密切相关,GNU Awk 是 Awk 的 GNU 实现。

        • find 用于根据文件特征(例如名称或修改时间)在一组目录中定位文件。 GNU Find 比 Find 的传统或 POSIX 版本具有更多功能。

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

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

        • awk 是一种模式匹配和格式化语言。它是一种编程语言,您提到的其他工具不是。需要时,它非常有用。但是,Perl 和 Python 也具有 Awk 的功能和许多附加功能,因此很多人使用它们来代替 Awk。 GNU Awk 比传统或 POSIX 版本的 Awk 具有更多功能。

        因此,您列出的工具执行不同的工作,但可以通过多种方式协同工作。您应该注意的另一个工具是xargs,它获取文件列表并依次对每个文件运行指定的命令。

        【讨论】:

        • 好一个。其他对 shell 使用有用的工具可能包括exprtestsort/uniq/comm/join/cut/paste 集合,等等……
        【解决方案5】:

        针对不同工作的不同工具。问题就像“什么是更好的工具:锤子、螺丝刀或组合钳?”

        grep - 在文件/流中查找/过滤文本。行匹配/不匹配 - 将其流式传输到输出。用于将输出量减少到您需要的量。如果您获得太多信息,则通常以交互方式使用。也经常在脚本中用于拉出“包含我需要的那一行”

        通常在脚本使用 grep 之后,您会看到 awk(一个复杂的表达式或只是一个老派程序员)或 cut(这要快得多但非常简单)来提取一个值。 (grep 水平切,cut/awk 垂直切)

        目前几乎看不到使用 awk 进行全功能编程。

        sed - 搜索和替换,通常是脚本化的(如果您想以交互方式执行此操作,可视化编辑器会更好 - 您会看到正在执行的操作。)

        find - 查找符合给定(高级)参数的文件。

        【讨论】:

          猜你喜欢
          • 2017-08-28
          • 1970-01-01
          • 2011-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多