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、精确查找

  1. find 路径信息 -type 文件类型 -name "文件名"

2、模糊查找

  1. find 路径信息 -type 文件类型 -name "文件名*"
  2. find 路径信息 -type 文件类型 -name "*文件名"
  3. find 路径信息 -type 文件类型 -name "文*件名"

3、忽略字符大小写查找

  1. find 路径信息 -type 文件类型 -iname "文件名*"

4、根据数据大小查找

  1. find /test -type f -size +100--找出大于100k的文件
  2. find /test -type f -size -100--找出小于100k的文件
  3. find /test -type f -size +1M--找出大于1M的文件
  4. b for 512-byte blocks (this is the default if no suffix is used)
  5. c for bytes (推荐)
  6. w for two-byte words
  7. k for Kilobytes (units of 1024 bytes) (推荐)
  8. M for Megabytes (units of 1048576 bytes) (推荐)
  9. G for Gigabytes (units of 1073741824 bytes)

5、递归目录查找

  1. find /test -maxdepth 1 -type f -name "test*"

6、实战

6.1、如何找出/test/目录中.txt结尾的文件,将找出的文件进行统一删除
  1. find /test/ -maxdepth 1 -type f -name "*.txt" -delete
  2. find /test/ -type f -name "*.txt" -exec rm -rf {} \;
  3. find /test/ -type f -name "*.txt" | xargs rm -f
  4. rm -rf $(find /test -type f -name "*.txt")
  5. rm -f `find /test/ -type f -name "*.txt"`

6.2、如何找出/test/目录中.txt结尾的文件,将找出的文件进行批量复制/移动到/tmp目录中
  1. find /test/ -maxdepth 1 -type f -name "*.txt" -exec cp {} /tmp \;
  2. find /test/ -maxdepth 1 -type f -name "*.txt" | xargs cp /tmp
  3. # xargs其作用是将查找内容一列变为1行

6.3、查找指定数据信息进行删除
  1. 01.find /test -type f -name "test*.txt"|xargs rm
  2. 02.find /test -type f -name "test*.txt" -exec rm -rf {} \;
  3. 03.find /test -type f -name "test*.txt" -delete

6.4、查找指定数据信息进行复制
  1. 01.find /test -type f -name "test*.txt"|xargs -i cp {} /test01/
  2. 02.find /test -type f -name "test*.txt"|xargs cp -t /test01/
  3. 03.find /test -type f -name "test*.txt" -exec cp -a {} /test01 \;

6.5、查找指定数据信息进行移动
  1. 01.find /test -type f -name "test*.txt"|xargs -i mv {} /test01/
  2. 02.find /test -type f -name "test*.txt"|xargs mv -t /test01/
  3. 03.find /test -type f -name "test*.txt" -exec mv {} /test01 \;

6.6、查找指定数据信息按照日期
  1. 01.查找7天以前的数据:find /test -type f -mtime +7
  2. 02.查找最近7天的数据:find /test -type f -mtime -7
  3. 03.查找距今第7天数据:find /test -type f -mtime 7

netstat和lsof

  1. netstat -tnlup 用于显示 tcpudp 的端口和进程等相关情况。
  2. netstat 查看端口占用语法格式:
  3. netstat -tunlp | grep 端口号
  4. -t (tcp) 仅显示tcp相关选项
  5. -u (udp)仅显示udp相关选项
  6. -n 拒绝显示别名,能显示数字的全部转化为数字
  7. -l 仅列出在Listen(监听)的服务状态
  8. -p 显示建立相关链接的程序名
  9. 更多命令:
  10. netstat -ntlp //查看当前所有tcp端口
  11. netstat -ntulp | grep 80 //查看所有80端口使用情况
  12. netstat -ntulp | grep 3306 //查看所有3306端口使用情况
  13. ————————————————————————————————————————————————————————————————————————
  14. lsof 查看端口占用语法格式:
  15. lsof -i:端口号
  16. 更多 lsof 的命令如下:
  17. lsof -i:8080:查看8080端口占用
  18. lsof abc.txt:显示开启文件abc.txt的进程
  19. lsof -c abc:显示abc进程现在打开的文件
  20. lsof -c -p 1234:列出进程号为1234的进程所打开的文件
  21. lsof -g gid:显示归属gid的进程情况
  22. lsof +d /usr/local/:显示目录下被进程开启的文件
  23. lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
  24. lsof -d 4:显示使用fd4的进程
  25. lsof -i -U:显示所有打开的端口和UNIX domain文件

正则符号

常用的^ $ . * [] [^] | + () {} ?

  1. ^ 以什么字符开头的一行信息
  2. $ 以什么字符结尾的一行信息
  3. ^$ 过滤空行信息
  4. 匹配任意一个且只有一个字符
  5. -o 显示grep命令执行过程(grep -o "." test.txt
  6. 前一个字符出现0次或者多次
  7. .* 匹配文件中所有信息(包含空行)
  8. ^.*xxx 以任意字符开头xxx结尾(贪婪匹配)
  9. ^xxx.*xxx$ xxx开头,xxx结尾的所有行
  10. 还原字符的本来意思
  11. '.$' 查询出以点结尾的行信息
  12. tr 源信息 替换后信息 # 对数据信息进行替换处理,采用一对一替换(sed命令的阉割版 cat test.txt | tr "zhang" "cao"
  13. \n 匹配一个换行符号
  14. \r 匹配一个换行符号
  15. \t 匹配一个制表符号
  16. [ ] 包含括号中信息的
  17. [abc] 匹配包含abc信息的字符
  18. [1] 匹配包含abc信息的字符开头的信息
  19. [a-zA-Z0-9] 找出所有以小写字母大写字母和数字信息的字符
  20. [a-Z] 找出所有以小写字母或大写字母组成字符(只能grep/egrep使用)
  21. [2].*[.!]$ 表示以小写字母开头并且以点或叹号结尾的信息过滤出来
  22. [^] 表示排除括号中信息的
  23. [^abc] 表示排除包含abc信息的字符
  24. [abc] 表示排除包含abc信息的字符开头的行(不包含空行)
  25. 前一个字符连续出现了1次或多次以上
  26. grep "0+" file 取出数字0字符,以及连续的多个数字0字符
  27. grep "[a-z]+" file 取出文件中的所有连续的小写字母(其实是取出单词信息)
  28. | 匹配多个满足条件的信息(或者)
  29. () 匹配一个整体信息
  30. egrep oldb(o|e)y" file 过滤指定整体信息
  31. sed -r 's#(.*)#<\1>#g' 利用sed命令实现后项引用前项
  32. sed -r 's#([0-9]+)#<\1>#g' 利用sed命令实现后项引用前项
  33. sed -r 's#(..)(...)(..)#<\1><\2>#g' 利用sed命令实现后项引用前项
  34. {} 定义前面字符出现次数
  35. x{n,m} 前一个字符至少连续出现n次,最多出现m
  36. x{n} 前一个字符正好连续出现了n
  37. x{n,} 前一个字符至少连续出现n次,最多出现多少次不限
  38. x{,m} 前一个字符至少连续出现0次,最多出现m
  39. ? 定义前面字符出现0次或1

grep(过滤筛选信息)

命令语法格式:

  1. grep -参数 --color=auto ”搜寻字符串“ filename

grep参数介绍:

  1. -A after 在什么后面
  2. -B before 在什么前面
  3. -C centre 在什么中间
  4. -c 统计信息出现的次数
  5. --color=auto :可以将找到的关键词部分加上颜色的显示喔!

1、筛选出有test的信息

  1. grep "test" test.txt --从test.txt文件中筛选出有test的信息

2、筛选出有test的信息,但要有test信息的上一行信息也显示

  1. grep -B 1 "test" test.txt

3、筛选出有test的信息,但要有test信息的下一行信息也显示

  1. grep -A 1 "test" test.txt

4、筛选出有test的信息,但要有test信息的上一行和下一行信息也显示

  1. grep -C 1 "test" test.txt

5、统计test信息在文件中出现了几次

  1. 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、根据文件内容的行号查询
  1. sed -n '3p' person.txt --显示单行信息
  2. sed -n '1,3p' person.txt --显示1-3行信息(连续)
  3. sed -n '1p;3p' person.txt --显示第1、第3共两行(不连续)
  4. sed -n '1~2p' 1.txt --只显示奇数列的行
  5. sed -n '0~2p' 1.txt --只显示偶数列的行

1.2、根据内容信息输出单行内容
  1. sed -n '/test/p' person.txt --将含有test的行显示出来
  2. sed -n '/test/,/Alex/p' person.txt --显示包含testAlex行之间的所有行信息(连续)
  3. sed -n '/test/p;/Alex/p' person.txt --只显示包含testAlex的行

2、增加信息(i:行前、a:行后)

  1. sed '1iHelloworld' test.txt --在文件最前面增加一行Helloworld
  2. sed '$abaibai' test.txt --在文件最后面增加一行baibai
  3. sed '3afour' test.txt --在第三行后面增加一行four
  4. sed '2itwo' test.txt --在第二行前面增加一行two
  5. sed -e '/test/iqian' -e '/test/ahou' test.txt --在包含test行的前天增加一行qian,后面增加一行hou
  6. sed '$a100\n101' test.txt --增加多行信息

3、sed命令删除信息

  1. sed '3d' test.txt --删除第3行(单行)
  2. sed '2,6d' test.txt --删除第2-6行(连续行)
  3. sed '3d;6d' test.txt --删除第3行和第6

4、利用sed命令取消空行显示?

  1. sed -n '/./p' test.txt
  2. sed '/^$/d' test.txt
  3. sed -n '/^$/!p' test.txt

5、sed命令修改信息

  1. vim 替换: :%s#one#two#g
  2. sed 's#要修改的内容#修改后的内容#g' test.txt
  3. sed 's#one#two#g'
  4. sed 's/#one/two/g' test.txt

6、后项引用前项进行替换修改

  1. sed 's#()#\n#g' test.txt
  2. ip a s eth0|sed -rn '3s#^.*net(.*)/24.*#\1#gp' --取出IP地址
  3. sed -i.bak 's#one#two#g' test.txt --修改文件内容并自动备份
  4. PS:在真实替换文件内容时候,一定不能让ni参数同时出现
  5. ni和参数同时使用,会将文件内容进行清空

测验替换功能:

  1. 创建测试环境:
  2. -rw-r--r-- 1 root root 0 Jun 7 19:43 test00.txt
  3. -rw-r--r-- 1 root root 0 Jun 7 19:43 test01.txt
  4. -rw-r--r-- 1 root root 0 Jun 7 19:43 test02.txt
  5. -rw-r--r-- 1 root root 0 Jun 7 19:43 test03.txt
  6. 批量修改文件的扩展名称 testxx.txt扩展名修改为testxx.jpg
  7. ls test*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'
  8. mv test00.txt test00.jpg
  9. mv test01.txt test01.jpg
  10. mv test02.txt test02.jpg
  11. mv test03.txt test03.jpg
  12. 批量重命名专业命令: rename
  13. rename .txt .jpg test*.txt
  14. 命令 文件名称 需要修改的部分信息 修改成什么信息 将什么样的文件进行修改

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次 截取出来

  1. netstat -tnlap | grep "ESTABLISHED" | awk '{print $5}' | awk -F : '{print $1}' | uniq -c | sort -rn | awk '{if ($1 > 1000) print $2}'
  2. iptables -I INPUT -s 1.2.3.4 -j DROP #拉黑IP
  3. awk 'NR%2==1' /etc/passwd 显示passwd 文件奇数行显示
  4. 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、按照行号查询
  1. awk 'NR==2' test.txt --显示第2行信息
  2. awk 'NR==2,NR==4' test.txt --显示第2-4行信息
  3. awk 'NR==2;NR==4' test.txt --显示第2行和第4行信息
  4. PS:在linux
  5. test=10 --赋值变量信息
  6. test==10 --test等于10

1.2、按照字符查询
  1. awk '/one/' test.txt --显示含有字符one的行
  2. awk '/one/,/three/' test.txt --显示含有字符one的行到含有three字符的行之间的所有行
  3. awk '/one/;/three/' test.txt --显示含有字符one的行和含有字符three字符的行

1.3、显示xiaoyu的姓氏和ID号码
  1. awk '/Xiaoyu/{print $1,$3}' test.txt

1.4、姓氏是zhang的人,显示他的第二次捐款金额及他的名字
  1. awk '/Zhang/{print $NF}' test.txt|awk -F ":" '{print $3}' -F:指定分隔符
  2. awk -F ":" '/^Zhang/{print $3}' test.txt
  3. awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' test.txt --以空格和冒号为分隔符

1.5、显示所有以41开头的ID号码的人的全名和ID号码
  1. awk '$3~/^41/{print $1,$2,$3}' test.txt --找出第三列以41开头的所有行,输出该行的123列信息

1.6、 显示所有ID号码最后一位数字是1或5的人的全名
  1. 方法一:
  2. awk '$3~/1$|5$/{print $1,$2}' test.txt|column -t ##column -t 以表格形式显示(整齐)
  3. 方法二:
  4. awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
  5. 方法三:
  6. awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t

1.7、 显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
  1. #gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
  2. awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' test.txt --找出第4列含有Xiaoyu的所有行,将最后一列的分隔符:替换为$并输出最后一列

2、文件中空行进行排除/文件中注释信息进行排除
  1. grep -Ev "^#|^$" 文件信息
  2. sed -n '/^#|^$/!p' 文件信息
  3. awk '/^#|^$/' 文件信息

3、如何利用awk取出IP地址信息:
  1. ifconfig eth0|awk -F "[ /]+" 'NR==3{print $6}' --将以连续空格或/为分隔符,取出第3行的第6
  2. hostname -i

awk高级功能

1、正则表达式作为模式
  1. awk '/^oldboy/{print xx}'

2、利用比较匹配信息
  1. NR==2
  2. NR>=2
  3. NR<=2
  4. ":" 作为分隔符,查找第三段等于90的行
  5. awk -F ":" '$3=="90" {print $0}' test.txt

特殊的模式

1、BEGIN{} 在awk执行命令前做什么事情:
  1. awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}' test.txt |column -t
  2. QQ 捐款记录
  3. Zhang Dandan 41117397 :250:100:175
  4. Zhang Xiaoyu 390320151 :155:90:201
  5. Meng Feixue 80042789 :250:60:50
  6. ...
  7. 修改内置分隔符变量
  8. awk -F ":" '{print $2}' test.txt
  9. awk 'BEGIN{FS=":"}{print $2}' test.txt

2、END{} 在awk执行命令结束之后做的操作
  1. awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' test.txt |column -t
  2. QQ 捐款记录
  3. Zhang Dandan 41117397 :250:100:175
  4. Zhang Xiaoyu 390320151 :155:90:201
  5. ...
  6. 操作结束

统计累加运算

1、统计/etc/services文件中空行数量
  1. 利用awk公式进行累加运算
  2. awk '/^$/{i=i+1;print i}' /etc/services
  3. awk '/^$/{i=i+1}END{print i}' /etc/services --输出最终多少行

2、统计/etc/services文件中有井号开头的行
  1. awk '/^#/{i++}END{print i}' /etc/services

3、统计系统中有多少个虚拟用户 普通用户
  1. 第一个历程: 用户信息都保存在什么文件中了
  2. 用户信息保存文件: /etc/passwd
  3. 第二个历程: 从文件中匹配出虚拟用户 普通用户
  4. 匹配普通用户
  5. awk '$NF~/bash/' /etc/passwd
  6. awk '$NF~/\/bin\/bash/' /etc/passwd
  7. 第三个历程: 进行统计
  8. 普通用户数量
  9. awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd --统计最后一列含有bash的所有行
  10. 63
  11. 虚拟用户数量
  12. awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd --统计最后一列不含bash的所有行
  13. 22

求和运算

  1. sum=sum+$n(需要进行数值求和的列)
  2. seq 10|awk '{sum=sum+$1;print sum}'