我是Linux/Unix的新手。我发现有些任务可以使用多种命令完成。它们之间是否存在关联?哪一个更受青睐?哪一个已经过时?
谢谢。
我是Linux/Unix的新手。我发现有些任务可以使用多种命令完成。它们之间是否存在关联?哪一个更受青睐?哪一个已经过时?
谢谢。
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
,它接受文件列表并依次在每个文件上运行指定的命令。expr
、test
、sort
/uniq
/comm
/join
/cut
/paste
等等... - ephemientsed -e 's/foo/bar/g'
awk '{ gsub(/foo/, "bar"); print $0 }'
awk '{gsub(/foo/,"bar")}1'
grep
查找文本。基本的 grep
功能可以很容易地在 sed
和 awk
中模拟。以下两者等价:
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标签已保留。这些工具的功能不同,所以首选取决于你想要做什么。
在你提到的工具中,find
和其他工具略有不同 -- 它可以在文件系统上搜索具有某些属性(名称、日期、权限等)的文件。
sed
和 grep
以文本文件作为输入,对其进行操作并输出结果。它们都广泛使用正则表达式。sed
("流编辑器")通常用于搜索和替换操作。grep
("全局正则表达式打印")输出与某个模式匹配的文本文件中的行。
在Linux系统上,awk
和 gawk
通常是同一个程序的不同名称,即GNU版本的AWK(以其创建者"Aho, Weinberger, Kernighan"命名)。awk
还可以指"经典"版本的 awk
,它没有GNU扩展,并且还有其他变体 nawk
("新awk")和 mawk
("Mike's AWK")。awk
的功能远远超出了模式匹配; 它实际上是一种完整的编程语言,尽管它是针对将输入文本分解为行和字段并对其进行操作(包括数字运算,因此很容易做到诸如总列或进行统计计算之类的事情)。
man command
,例如man 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的东西。