find
Linux 系统中的find命令在查找文件时非常有用而且方便。它可以根据不同的条件来查找文件,例如权限,拥有者,修改日期/时间,文件大小等等。接下来我们将学习如何使用find命令以及它所提供的选项来查找文件。find命令的基本语法如下:
find [path] [option] [expression]
find ~ -name hello.c //在主目录及其所有子目录下找出所有hello.c文件
find -name "*.txt" //在当前路径及其所有子目录下找出所有.txt文件
find -name "*.c" -o -name ".txt" //在当前路径及其所有子目录下找出所有.c和.txt文件
find -iname "*.TXT" //在当前路径及其所有子目录下找出所有.txt文件,并忽略大小
find -maxdepth 2 -iname "*.TXT" // 在当前路径及其所有子目录(深度不超过2级)下找出所有.txt文件,并忽略大小
find . -size +1M -size -10M //查找大于1M,<10M的文件
find . -mmin -60 //查找过去1小时内修改过内容的文件
grep
Linux中的grep命令是一个强大的字符搜索匹配工具,它主要是对文本或输出内容进行过滤,并按行检索输入的每一行,如果输入行包含模式pattern(正则表达式),则输出这一行。今后在我们的工作中很多情况下都会使用grep命令,它单一个功能非常强大,但也存在短板,grep最明显的短板就是不能对已知结果进行更改.
grep root /etc/passwd //在/etc/passwd中查找包含root字符串的行
grep -n root /etc/passwd //在/etc/passwd中查找包含root字符串的行并显示行号
grep /bin/bash$ /etc/passwd //在/etc/passwd中查找以/bin/bash结尾的行
grep ^# /etc/ssh/sshd_config //在sshd的配置文件中查找所有以#开头的行(即所有注释)
grep -v ^# /etc/ssh/sshd_config //在sshd的配置文件中查找所有不是以#开头的行(即所有注释),即过滤掉注释后的配置
grep "^[^a-s]" /etc/passwd //第一个^表示行首,第二个在[]内部的首个字符^表示取反。输出文件/etc/passwd中不以a-s中任何一个字母开头的行
grep "0\{3,\}" /etc/passwd //输出文件/etc/passwd中字符0连续出现三次及以上的行(注意转义字'\')
正则表达式
一个正则表达式就是描述了一个字符串集合的方式。正则表达式的表示就是一些特殊符号的组合,而每个符号代表着一些具体的意思。符号的组合就定义了一套规则和方法,其主要作用就是从大量文本中匹配出符合条件的行。
Linux中,正则表达式的主要使用场景就是文本处理三剑客。grep,sed,awk.除此之外,vi指令也支持正则表达式;在正则表达式中,又可以分为基本正则表达式和扩展正则表达式。其主要区别在于:
基本正则表达式只认识元字符,其元字符主要包括:^ $ . [] *, 具体含义见下表
扩展正则表达式又添加了() {} ? + | 等符号
元字符 | 含义 | 实例 |
^ | 匹配行首 | ^abc:匹配以abc开头的字符 |
$ | 匹配行尾 | abc$:匹配以abc结尾的字符 |
^$ | 空行 | 表示空行的意思 |
. | 匹配任意单个字符 | .a:匹配任意和a结合的两个字符,其中必须是后面 |
* | 字符*匹配0或多个此字符 | *.a:匹配任意一个或多个含有a的字符 |
.* | 代表任意多个字符 | 就是代表任意多个字符 |
\ | 屏蔽一个元字符的特殊含义 | 表示去掉有意义的元字符的含义 |
[] | 匹配中括号内的字符 | [abc]:代表匹配a或b或c |
[^abc] | 匹配不包含括号内的任意字符 | [^abc]:代表对abc的取反 |
扩展正则表达式又添加了(),{},+,|,等符号,扩展正则表达式使用egrep命令查找
egrep w+ /etc/passwd 查找包含一个或多个w的行
egrep w{3} /etc/passwd 查找www出现的行
字符 | 含义 | 实例 |
+ | 重复前一个字符或多次 | a+:匹配包含一个或多个a的字符 |
? | 重复前面一个字符0次或一次 | a?:匹配 |
| | 同时匹配|两边的字符 | "abc\|bcd":匹配包含abc |
() | 可以和()的字符分组匹配 | “abc(d\|e\|f)”:匹配abcd,abce,abcf字符 |
{} | 匹配前面字符的次数 | |
“abc{2}”:至少匹配abc两次 | ||
“abc{2,5}”:匹配abc两到五次 |
管道
linux管道使用竖线(|,管道符)连接多个命令时,这样就可以把一个命令的输出作为下一个命令的输出作为下一个命令的输入,也就是说当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。Linux管道的输入。Linux管道的具体语法格式:cmd1|cmd2|cmd3
dengleen@raspberrypi3:~ $ ls | wc
35 35 392
dengleen@raspberrypi3:~ $
dengleen@raspberrypi3:~ $ cat /etc/passwd | grep dengleen
dengleen:x:1000:1000:,,,:/home/dengleen:/bin/bash
dengleen@raspberrypi3:~ $
dengleen@raspberrypi3:~ $ cat /etc/passwd | grep dengleen | cut -d: -f3
1000
dengleen@raspberrypi3:~ $
dengleen@raspberrypi3:~ $ cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
dengleen@raspberrypi3:~ $
dengleen@raspberrypi3:~ $ cat /proc/cpuinfo | grep processor | wc -l
4
dengleen@raspberrypi3:~ $
dengleen@raspberrypi3:~ $ find -iname "*.txt"
./ahello.txt
./CH341SER/readme.txt
./FreeModbus_Slave-Master-RTT-STM32/RT-Thread-1.2.2/components/CMSIS/README.txt
./FreeModbus_Slave-Master-RTT-STM32/RVMDK/JLinkLog.txt
./FreeModbus_Slave-Master-RTT-STM32/RVMDK/JLink Regs CM3.txt
./FreeModbus_Slave-Master-RTT-STM32/FreeModbus/gpl.txt
./FreeModbus_Slave-Master-RTT-STM32/FreeModbus/bsd.txt
./FreeModbus_Slave-Master-RTT-STM32/FreeModbus/lgpl.txt
./FreeModbus_Slave-Master-RTT-STM32/Libaries/CMSIS_EWARM/README.txt
./FreeModbus_Slave-Master-RTT-STM32/Libaries/CMSIS_EWARM/readme_patch.txt
./.vim/doc/acp.txt
./.vim/doc/omnicppcomplete.txt
./.vim/doc/winmanager.txt
./.vim/doc/csupport.txt
dengleen@raspberrypi3:~ $ find -iname "*.txt" | grep hello
./ahello.txt
dengleen@raspberrypi3:~ $