目录
- find 命令
- grep命令
- awk命令
find 命令
作用: find
命令主要用于查找满足某种条件的文件。
语法:find 查找的起始目录 选项 查找的关键字
例如:
在当前目录下查找以.txt
结尾的文件
find . -name "*.txt"
在当前目录下查找以字母A到Z开始的文件
find . -name "[A-Z]*"
# 或者是
find -name "[A-Z]*"
在当前目录下找属性为755(权限)的文件
find . -perm 755
在当前目录下找属主为root的文件
find -user root
当然,也可以多个条件结合起来使用,查找以txt结尾类型是文件的文件
find -type f -name "*.txt"
在/var下找更改时间在5天以内的文件
find /var -mtime -5
在/var下找更改时间在3天以前的文件
find /var -mtime +3
查找类型为目录的文件
find /etc -type d
查找文件大小大于1M的文件 1M约等于1000000个字节
find . -size +1000000c
grep命令
find
命令主要用于检索文件,grep
命令也是用于检索,但它主要针对文件内容。
语法:grep 选项 "目标字符" 目标文件
来看几个例子:
统计file.txt中有几行文件包含linux
grep -c 'linux' file.txt
展示file.txt中有哪些行包含linux,并列出其对应行号
grep -n 'linux' file.txt
检索file.txt文件中包含Linux的行,忽略大小写匹配,即LINUX、linux、LiNUx等都可以被检索到。
grep -i "Linux" file.txt
v
表示取反,举个例子,我们做java开发的,开发过程中经常会把项目部署到开发服务器。 但是由于要经常部署,每次部署都需要经过查找原来的进程、杀死原进程、启动新的进程这几个步骤,为了提高效率,我们通常会写一个简单的shell
脚本把上面的三个步骤都在脚本里一次做了,简单shell
脚本示例如下:
#!/bin/bash
# 重启服务脚本
appName=aa.jar
# 查找旧的进程并且kill
ps -ef | grep $appName | grep -v 'grep' | cut -c 9-15 | xargs kill -9
# 重启新的进程
nohup java -jar && > xx.log &
echo "重新启动服务完成"
简单说下上面的脚本执行过程,当我们执行 ps -ef | grep xx
以后得到的结果通常是类似如下两条:
root 8392 1 0 12月05 ? 00:15:30 java -jar colour-1.0.jar
root 18656 31379 0 20:56 pts/56 00:00:00 grep --color=auto colour
实际上我们只关心第一条数据,这时候需要去掉第二条数据,因此我们在后面的管道执行了 grep -v ‘grep’,这时得到的结果如下:
root 8392 1 0 12月05 ? 00:15:30 java -jar colour-1.0.jar
这个时候获取到的结果就只剩下我们需要的那一条了,然后使用cut
命令获取到进程号,然后传递给kill
命令,这样就达到了杀死旧的进程的效果。
相信通过上面的例子,我们对-v
这个选项的作用已经有了清晰的认识。
其实,grep
命令也支持基于正则的检索,关于正则表达式的内容,可以看我另一个系列的文章 重学正则表达式(一)
awk命令
awk
命令的作用非常强大,主要针对有一定规律的文件进行处理,它支持在命令中进行一些判断,最终输出想要的内容,这里只举几个简单的例子,后面会有专门的内容讲解它。
取出access.log 文件的第一行
awk '{print $0}' access.log
-F:
表示按:
进行猎德分割,不写默认以空格进行分割。
awk -F: '{print $1,$3}' access.log
去除 df 命令返回的结果的第二行内容
df | awk '{if(NR==3){print $0}}'
NR(number record)是awk中一个常量,表示行数 $0代表整行
今天的内容就到这里了,下节我们继续关注shell中文本过滤的几个其他命令,我们下节见!