find、grep、sed、awk命令总结
老大: awk 擅长统计分析文件内容 擅长对文件中列进行操作
老二: sed 修改替换文件内容 擅长对文件中的行进行操作
老三: grep 过滤筛选信息
find(以文件为单位进行查找)
命令语法格式: find [路径] [选项] [操作]
find选项介绍: -user cao 文件所属用户为 cao 的所有文件 -group cao 文件所属组为 cao 的所有文件 -type 根据类型查找 f 文件 find . -type f d 目录 find . -type d c 字符设备文件 find . -type c b 块设备文件 find . -type b l 链接文件 find . -type l p 管道文件 find . -type p -size 根据文件大小查询 -mtime -n n天以内修改过的文件,+n n天之前 -mmin -n n分钟以内修改过的文件,+n n分钟之前 -mindepth n 从第 n 级目录开始搜索 -maxdepth n 表示至多搜索到第 n-1 级子目录 -perm 根据权限查询
1、精确查找
find 路径信息 -type 文件类型 -name "文件名"
2、模糊查找
find 路径信息 -type 文件类型 -name "文件名*"
find 路径信息 -type 文件类型 -name "*文件名"
find 路径信息 -type 文件类型 -name "文*件名"
3、忽略字符大小写查找
find 路径信息 -type 文件类型 -iname "文件名*"
4、根据数据大小查找
find /test -type f -size +100--找出大于100k的文件
find /test -type f -size -100--找出小于100k的文件
find /test -type f -size +1M--找出大于1M的文件
b for 512-byte blocks (this is the default if no suffix is used)
c for bytes (推荐)
w for two-byte words
k for Kilobytes (units of 1024 bytes) (推荐)
M for Megabytes (units of 1048576 bytes) (推荐)
G for Gigabytes (units of 1073741824 bytes)
5、递归目录查找
find /test -maxdepth 1 -type f -name "test*"
6、实战
6.1、如何找出/test/目录中.txt结尾的文件,将找出的文件进行统一删除
find /test/ -maxdepth 1 -type f -name "*.txt" -delete
find /test/ -type f -name "*.txt" -exec rm -rf {} \;
find /test/ -type f -name "*.txt" | xargs rm -f
rm -rf $(find /test -type f -name "*.txt")
rm -f `find /test/ -type f -name "*.txt"`
6.2、如何找出/test/目录中.txt结尾的文件,将找出的文件进行批量复制/移动到/tmp目录中
find /test/ -maxdepth 1 -type f -name "*.txt" -exec cp {} /tmp \;
find /test/ -maxdepth 1 -type f -name "*.txt" | xargs cp /tmp
# xargs其作用是将查找内容一列变为1行
6.3、查找指定数据信息进行删除
01.find /test -type f -name "test*.txt"|xargs rm
02.find /test -type f -name "test*.txt" -exec rm -rf {} \;
03.find /test -type f -name "test*.txt" -delete
6.4、查找指定数据信息进行复制
01.find /test -type f -name "test*.txt"|xargs -i cp {} /test01/
02.find /test -type f -name "test*.txt"|xargs cp -t /test01/
03.find /test -type f -name "test*.txt" -exec cp -a {} /test01 \;
6.5、查找指定数据信息进行移动
01.find /test -type f -name "test*.txt"|xargs -i mv {} /test01/
02.find /test -type f -name "test*.txt"|xargs mv -t /test01/
03.find /test -type f -name "test*.txt" -exec mv {} /test01 \;
6.6、查找指定数据信息按照日期
01.查找7天以前的数据:find /test -type f -mtime +7
02.查找最近7天的数据:find /test -type f -mtime -7
03.查找距今第7天数据:find /test -type f -mtime 7
netstat和lsof
netstat -tnlup 用于显示 tcp,udp 的端口和进程等相关情况。
netstat 查看端口占用语法格式:
netstat -tunlp | grep 端口号
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
更多命令:
netstat -ntlp //查看当前所有tcp端口
netstat -ntulp | grep 80 //查看所有80端口使用情况
netstat -ntulp | grep 3306 //查看所有3306端口使用情况
————————————————————————————————————————————————————————————————————————
lsof 查看端口占用语法格式:
lsof -i:端口号
更多 lsof 的命令如下:
lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件
正则符号
常用的^ $ . * [] [^] | + () {} ?
^ 以什么字符开头的一行信息
$ 以什么字符结尾的一行信息
^$ 过滤空行信息
. 匹配任意一个且只有一个字符
-o 显示grep命令执行过程(grep -o "." test.txt)
* 前一个字符出现0次或者多次
.* 匹配文件中所有信息(包含空行)
^.*xxx 以任意字符开头xxx结尾(贪婪匹配)
^xxx.*xxx$ 以xxx开头,xxx结尾的所有行
\ 还原字符的本来意思
'.$' 查询出以点结尾的行信息
tr 源信息 替换后信息 # 对数据信息进行替换处理,采用一对一替换(sed命令的阉割版 cat test.txt | tr "zhang" "cao")
\n 匹配一个换行符号
\r 匹配一个换行符号
\t 匹配一个制表符号
[ ] 包含括号中信息的
[abc] 匹配包含a或b或c信息的字符
[1] 匹配包含a或b或c信息的字符开头的信息
[a-zA-Z0-9] 找出所有以小写字母大写字母和数字信息的字符
[a-Z] 找出所有以小写字母或大写字母组成字符(只能grep/egrep使用)
[2].*[.!]$ 表示以小写字母开头并且以点或叹号结尾的信息过滤出来
[^] 表示排除括号中信息的
[^abc] 表示排除包含a或b或c信息的字符
[abc] 表示排除包含a或b或c信息的字符开头的行(不包含空行)
+ 前一个字符连续出现了1次或多次以上
grep "0+" file 取出数字0字符,以及连续的多个数字0字符
grep "[a-z]+" file 取出文件中的所有连续的小写字母(其实是取出单词信息)
| 匹配多个满足条件的信息(或者)
() 匹配一个整体信息
egrep “oldb(o|e)y" file 过滤指定整体信息
sed -r 's#(.*)#<\1>#g' 利用sed命令实现后项引用前项
sed -r 's#([0-9]+)#<\1>#g' 利用sed命令实现后项引用前项
sed -r 's#(..)(...)(..)#<\1><\2>#g' 利用sed命令实现后项引用前项
{} 定义前面字符出现次数
x{n,m} 前一个字符至少连续出现n次,最多出现m次
x{n} 前一个字符正好连续出现了n次
x{n,} 前一个字符至少连续出现n次,最多出现多少次不限
x{,m} 前一个字符至少连续出现0次,最多出现m次
? 定义前面字符出现0次或1次
grep(过滤筛选信息)
命令语法格式:
grep -参数 --color=auto ”搜寻字符串“ filename
grep参数介绍:
-A after 在什么后面
-B before 在什么前面
-C centre 在什么中间
-c 统计信息出现的次数
--color=auto :可以将找到的关键词部分加上颜色的显示喔!
1、筛选出有test的信息
grep "test" test.txt --从test.txt文件中筛选出有test的信息
2、筛选出有test的信息,但要有test信息的上一行信息也显示
grep -B 1 "test" test.txt
3、筛选出有test的信息,但要有test信息的下一行信息也显示
grep -A 1 "test" test.txt
4、筛选出有test的信息,但要有test信息的上一行和下一行信息也显示
grep -C 1 "test" test.txt
5、统计test信息在文件中出现了几次
grep -c 1 "test" test.txt
sed(修改替换文件内容 擅长对文件的行进行更改)
命令语法格式: 标准格式:sed [选项] [sed指令] [文件信息] 举例说明:sed -i.bak ‘s#test#test01#g’ test.txt sed命令参数信息: -n 仅显示script处理后的结果 -r 识别扩展正则 -i 真实编辑文件(将内存中的信息覆盖到磁盘中) -e 识别sed命令多个操作指令 sed命令指令信息: p print 输出信息 i insert 插入信息,在指定信息前面插入新的信息 a append 附加信息,在指定信息后面附加新的信息 d delete 删除指定信息 s substitute 替换信息 s###g(全局替换) c 替换修改指定的一整行信息 指令修饰:g PS:相同指令信息只能使用一次,想使用多次需要加上分号
1、查询信息
1.1、根据文件内容的行号查询
sed -n '3p' person.txt --显示单行信息
sed -n '1,3p' person.txt --显示1-3行信息(连续)
sed -n '1p;3p' person.txt --显示第1、第3共两行(不连续)
sed -n '1~2p' 1.txt --只显示奇数列的行
sed -n '0~2p' 1.txt --只显示偶数列的行
1.2、根据内容信息输出单行内容
sed -n '/test/p' person.txt --将含有test的行显示出来
sed -n '/test/,/Alex/p' person.txt --显示包含test到Alex行之间的所有行信息(连续)
sed -n '/test/p;/Alex/p' person.txt --只显示包含test、Alex的行
2、增加信息(i:行前、a:行后)
sed '1iHelloworld' test.txt --在文件最前面增加一行Helloworld
sed '$abaibai' test.txt --在文件最后面增加一行baibai
sed '3afour' test.txt --在第三行后面增加一行four
sed '2itwo' test.txt --在第二行前面增加一行two
sed -e '/test/iqian' -e '/test/ahou' test.txt --在包含test行的前天增加一行qian,后面增加一行hou
sed '$a100\n101' test.txt --增加多行信息
3、sed命令删除信息
sed '3d' test.txt --删除第3行(单行)
sed '2,6d' test.txt --删除第2-6行(连续行)
sed '3d;6d' test.txt --删除第3行和第6行
4、利用sed命令取消空行显示?
sed -n '/./p' test.txt
sed '/^$/d' test.txt
sed -n '/^$/!p' test.txt
5、sed命令修改信息
vim 替换: :%s#one#two#g
sed 's#要修改的内容#修改后的内容#g' test.txt
sed 's#one#two#g'
sed 's/#one/two/g' test.txt
6、后项引用前项进行替换修改
sed 's#()#\n#g' test.txt
ip a s eth0|sed -rn '3s#^.*net(.*)/24.*#\1#gp' --取出IP地址
sed -i.bak 's#one#two#g' test.txt --修改文件内容并自动备份
PS:在真实替换文件内容时候,一定不能让n和i参数同时出现
ni和参数同时使用,会将文件内容进行清空
测验替换功能:
创建测试环境:
-rw-r--r-- 1 root root 0 Jun 7 19:43 test00.txt
-rw-r--r-- 1 root root 0 Jun 7 19:43 test01.txt
-rw-r--r-- 1 root root 0 Jun 7 19:43 test02.txt
-rw-r--r-- 1 root root 0 Jun 7 19:43 test03.txt
批量修改文件的扩展名称 将testxx.txt扩展名修改为testxx.jpg
ls test*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'
mv test00.txt test00.jpg
mv test01.txt test01.jpg
mv test02.txt test02.jpg
mv test03.txt test03.jpg
批量重命名专业命令: rename
rename .txt .jpg test*.txt
命令 文件名称 需要修改的部分信息 修改成什么信息 将什么样的文件进行修改
awk(擅长统计分析文件内容 擅长对文件的列进行更改)
语法格式:
awk [选项] ‘模式{动作}’ [文件信息] 行处理前 行处理 行处理后 awk BEGIN{} {} END{} 123.txt
内置变量
FS:field separator -F “:” == BEGIN{FS=”:”} == -vFS=”:” 字段分隔符变量
NR:number records —表示行号信息(默认表示总行数)
NF:number of fields —表示每一行有多少列(默认表示总列数)
awk命令中$符号用法
$1 $2 $3 : 取第几列信息
$NF : 取最后一列
$(NF-n) : 取倒数第几列
$0 : 取所有列的信息
配和参数: uniq -c 去重
数值比较
-gt 大于
-lt 小于
-eq 等于
-ne 不等于
-ge 大于等于
-le 小于等于
查出实时 哪个IP地址连接最多 哪个ip 访问大于 1000次 截取出来
netstat -tnlap | grep "ESTABLISHED" | awk '{print $5}' | awk -F : '{print $1}' | uniq -c | sort -rn | awk '{if ($1 > 1000) print $2}'
iptables -I INPUT -s 1.2.3.4 -j DROP #拉黑IP
awk 'NR%2==1' /etc/passwd 显示passwd 文件奇数行显示
awk 'NR%2==0' /etc/passwd 显示passwd 文件偶数行显示
awk的实际操作过程
测试环境:
Zhang Dandan 41117397 :250:\100:175 Zhang Xiaoyu 390320151 :155:90:201 Meng Feixue 80042789 :250:60:50 Wu Waiwai 70271111 :250:80:75 Liu Bingbing 41117483 :250:\100:175 Wang Xiaoai 3515064655 :50:95:135 Zi Gege 1986787350 :250:168:200 Li Youjiu 918391635 :175:75:300 Lao Nanhai 918391635 :250:\100:175
1、awk查询信息
1.1、按照行号查询
awk 'NR==2' test.txt --显示第2行信息
awk 'NR==2,NR==4' test.txt --显示第2-4行信息
awk 'NR==2;NR==4' test.txt --显示第2行和第4行信息
PS:在linux中
test=10 --赋值变量信息
test==10 --test等于10
1.2、按照字符查询
awk '/one/' test.txt --显示含有字符one的行
awk '/one/,/three/' test.txt --显示含有字符one的行到含有three字符的行之间的所有行
awk '/one/;/three/' test.txt --显示含有字符one的行和含有字符three字符的行
1.3、显示xiaoyu的姓氏和ID号码
awk '/Xiaoyu/{print $1,$3}' test.txt
1.4、姓氏是zhang的人,显示他的第二次捐款金额及他的名字
awk '/Zhang/{print $NF}' test.txt|awk -F ":" '{print $3}' -F:指定分隔符
awk -F ":" '/^Zhang/{print $3}' test.txt
awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' test.txt --以空格和冒号为分隔符
1.5、显示所有以41开头的ID号码的人的全名和ID号码
awk '$3~/^41/{print $1,$2,$3}' test.txt --找出第三列以41开头的所有行,输出该行的1,2,3列信息
1.6、 显示所有ID号码最后一位数字是1或5的人的全名
方法一:
awk '$3~/1$|5$/{print $1,$2}' test.txt|column -t ##column -t 以表格形式显示(整齐)
方法二:
awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
方法三:
awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
1.7、 显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
#gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' test.txt --找出第4列含有Xiaoyu的所有行,将最后一列的分隔符:替换为$并输出最后一列
2、文件中空行进行排除/文件中注释信息进行排除
grep -Ev "^#|^$" 文件信息
sed -n '/^#|^$/!p' 文件信息
awk '/^#|^$/' 文件信息
3、如何利用awk取出IP地址信息:
ifconfig eth0|awk -F "[ /]+" 'NR==3{print $6}' --将以连续空格或/为分隔符,取出第3行的第6列
hostname -i
awk高级功能
1、正则表达式作为模式
awk '/^oldboy/{print xx}'
2、利用比较匹配信息
NR==2
NR>=2
NR<=2
用 ":" 作为分隔符,查找第三段等于90的行
awk -F ":" '$3=="90" {print $0}' test.txt
特殊的模式
1、BEGIN{} 在awk执行命令前做什么事情:
awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}' test.txt |column -t
姓 名 QQ号 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
...
修改内置分隔符变量
awk -F ":" '{print $2}' test.txt
awk 'BEGIN{FS=":"}{print $2}' test.txt
2、END{} 在awk执行命令结束之后做的操作
awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' test.txt |column -t
姓 名 QQ号 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
...
操作结束
统计累加运算
1、统计/etc/services文件中空行数量
利用awk公式进行累加运算
awk '/^$/{i=i+1;print i}' /etc/services
awk '/^$/{i=i+1}END{print i}' /etc/services --输出最终多少行
2、统计/etc/services文件中有井号开头的行
awk '/^#/{i++}END{print i}' /etc/services
3、统计系统中有多少个虚拟用户 普通用户
第一个历程: 用户信息都保存在什么文件中了
用户信息保存文件: /etc/passwd
第二个历程: 从文件中匹配出虚拟用户 普通用户
匹配普通用户
awk '$NF~/bash/' /etc/passwd
awk '$NF~/\/bin\/bash/' /etc/passwd
第三个历程: 进行统计
普通用户数量
awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd --统计最后一列含有bash的所有行
63
虚拟用户数量
awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd --统计最后一列不含bash的所有行
22
求和运算
sum=sum+$n(需要进行数值求和的列)
seq 10|awk '{sum=sum+$1;print sum}'