[toc]

查找 find

查找文件或目录路径
用于在硬盘中查找文件或目录的路径(速度较慢)

find path [-option] [查找条件]

-name 根据文件名进行精确查找

example:

1
2
3
find / -name test.txt # 从根目录下开始查找精确匹配名字的文件路径

find ./ -name "*test*" # 从当前目录下开始查找包含test名字的所有文件和目录路径(*通配任意字符)

查看文件内容

  • 常用的查看文件内容命令:
    • cat: 直接查阅文件内容,不能翻页
    • more: 翻页查看文件内容
    • less: 翻页阅读,和 more 类似,但操作按键比 more 更弹性
    • head: 查看文档的前面几行内容,默认 10 行
    • tail: 查看文档的最后几行内容,默认 10 行

查找文件内容

grep 命令,在文本中或 stdin 中查找匹配字符串

grep [-cin] '目标字符串' filename

grep(global search regular expression(RE) and print out the line, 全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文件,并把匹配的行打印出来。

2022-04-19-16-34-39.png

常用选项:

  • -c: 计算找到’搜索字符串’的行数
  • -i: 忽略大小写的不同,所以大小写视为相同
  • -n: 顺便输出行号
  • -l: 根据文件内容查找文件,只显示包含该内容的文件名
  • -r: 根据文件内容递归查找文件,并打印对应内容
  • -I: 表示忽略二进制文件

2022-04-19-16-45-10.png

1
2
3
grep 'hello' * # 在当前目录搜索带有'hello'的文件
grep -l 'hello' * # 在当前目录搜索带有'hello'的文件,只显示文件名
grep -r 'hello' * # 在当前目录及其子目录下搜索'hello'的文件

管道命令

管道是一种通信机制,通常用于进程间的通信(也可通过 socket 进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。

管道又分为匿名管道具名管道(这里将不会讨论在源程序中使用系统调用创建并使用管道的情况,它与命令行的管道在内核中实际都是采用相同的机制)。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由 | 分隔符表示,| 在前面的内容中我们已经多次使用到了。具名管道简单的说就是有名字的管道,通常只会在源程序中用到具名管道。

  • 管道:将一个命令的输出连接到另一个命令的输入。
  • 符号:|
  • 例如:cat /etc/passwd | grep oracle (通常与 grep 配合用于过滤查找)

输出重定向

在更多了解 Linux 的重定向之前,我们需要先知道一些基本的东西,前面我们已经提到过 Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为 stdin(标准输入,对应于你在终端的输入,文本描述符 0),stdout(标准输出,对应于终端的输出,文本描述符 1),stderr(标准错误输出,对应于终端的输出,文本描述符 2)。

  • 标准文件:stdin, stdout, stderr
    • 对应的文件描述符为 0, 1, 2
  • 输出重定向:>(覆盖导入), >>(从文件末尾导入)
  • 输入重定向:<
  • 例如:
1
2
3
4
ls -l > ls.out  # 将ls -l命令重定向到文件ls.out中
find / -name filename 2> find.txt # 将命令错误输入重定向到文件中。
find / -name filename > find.txt # 将命令正确输出重定向到文件中
find / -name filename %> find.txt # 将命令所有输入重定向到文件中。

管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接。

cut 命令

cut 命令,打印每一行的某一字段。

打印 /etc/passwd 文件中以 : 为分隔符的第 1 个字段和第 6 个字段分别表示用户名和其家目录:

1
cut /etc/passwd -d ':' -f 1,6

打印 /etc/passwd 文件中每一行的前 N 个字符:

1
2
3
4
5
6
7
8
# 前五个(包含第五个)
cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
cut /etc/passwd -c 5-
# 第五个
cut /etc/passwd -c 5
# 2 到 5 之间的(包含第五个)
cut /etc/passwd -c 2-5

wc 命令

wc 命令,简单小巧的计数工具

wc 命令用于统计并输出一个文件中行、单词和字节的数目,比如输出 /etc/passwd 文件的统计信息

1
wc /etc/passwd

分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数:

1
2
3
4
5
6
7
8
9
10
# 行数
wc -l /etc/passwd
# 单词数
wc -w /etc/passwd
# 字节数
wc -c /etc/passwd
# 字符数
wc -m /etc/passwd
# 最长行字节数
wc -L /etc/passwd

sort 命令

将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。

默认为字典排序:

1
cat /etc/passwd | sort

反转排序:

1
cat /etc/passwd | sort -r

按特定字段排序:

1
at /etc/passwd | sort -t':' -k 3

上面的-t参数用于指定字段的分隔符,这里是以":"作为分隔符;-k 字段号用于指定对哪一个字段进行排序。这里/etc/passwd 文件的第三个字段为数字,默认情况下是以字典序排序的,如果要按照数字排序就要加上-n参数。

uniq 去重命令

uniq 命令可以用于过滤或者输出重复行。

  • 过滤重复行

我们可以使用 history 命令查看最近执行过的命令(实际为读取 ${SHELL}_history 文件,如我们环境中的 .zsh_history 文件),不过你可能只想查看使用了哪个命令而不需要知道具体干了什么,那么你可能就会要想去掉命令后面的参数然后去掉重复的命令:

1
history | cut -c 8- | cut -d ' ' -f 1 | uniq

然后经过层层过滤,你会发现确是只输出了执行的命令那一列,不过去重效果好像不明显,仔细看你会发现它确实去重了,只是不那么明显,之所以不明显是因为 uniq 命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序:

1
2
3
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者
history | cut -c 8- | cut -d ' ' -f 1 | sort -u

这就是 Linux/UNIX 哲学吸引人的地方,大繁至简,一个命令只干一件事却能干到最好。

  • 输出重复行
1
2
3
4
# 输出重复过的行(重复的只输出一个)及重复次数
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 输出所有重复的行
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D

文本处理命令还有很多,下一节将继续介绍一些常用的文本处理的命令。

xargs 命令

xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。

1
cut -d: -f1 < /etc/passwd | sort | xargs echo

上面这个命令用于将 /etc/passwd 文件按 : 分割取第一个字段排序后,使用 echo 命令生成一个列表。

Tests

  1. data1 文件里记录是一些命令的操作记录,现在需要你从里面找出出现频率次数前 3 的命令并保存在 /home/shiyanlou/result。
1
cat data1 |cut -c 8-|sort|uniq -dc|sort -rn -k1 |head -3 > /home/shiyanlou/result