你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Shell脚本基础从头开始(十)── shell的文本过滤

2021/12/24 7:05:05

目录

  • 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中文本过滤的几个其他命令,我们下节见!