目录
一、grep
Linux工具程序,可做文件内的字符串查找
到文件里去匹配字符串,然后将匹配的行显示出来,输出到屏幕上。
grep在匹配字符串时,为模糊匹配
模式:一些条件的组合,主要是一些字符串+数字+特殊符号,组成一个模式(或:表达式),用于表达某个意思
【举例】^root|^liu 就是一个模式:以root开头或者以liu开头
元字符:有特殊作用的符号==》描述其他字符。如:
1. ^ 表示以什么开头。如:^root 表示以root开头
2. | 或者
3. $
[root@localhost ~]# cat /etc/passwd | grep "^root"
root:x:0:0:root:/root:/bin/bash
1.1【选项】-i
忽略大小写
[root@localhost 0326]# cat phone.txt
xiaomi
XIAOMI
huawei
HUAWEI
oppo
OPPO
vivo
VIVO
meizu
MEIZU
[root@localhost 0326]# cat phone.txt |grep -i huawei
huawei
HUAWEI
[root@localhost 0326]# cat phone.txt |grep huawei
huawei
1.2【选项】-n
显示筛选出的行号
[root@localhost 0326]# cat phone.txt |grep -i -n huawei
3:huawei
4:HUAWEI
1.3【选项】-o
只显示匹配的内容
[root@localhost 0326]# cat phone.txt |grep oppo
oppo OPPO vivo
[root@localhost 0326]# cat phone.txt |grep -o oppo
oppo
1.4【选项】-v
反转查找,显示与模式不相匹配的行 ==》取反 invert
[root@localhost 0326]# cat phone.txt |grep -v xiaomi
XIAOMI
huawei
HUAWEI
oppo OPPO vivo
VIVO
meizu
MEIZU
1.5【选项】-r
递归搜索所有的文件
查找某个目录下所有的文件,然后去匹配字符串
[root@localhost ~]# grep -r "xiaomi" ./* ==》递归查找出当前目录下所有的文件里含有xiaomi的全部行
./lianxi/0326/phone.txt:xiaomi
./lihua.txt:xiaoming
[root@localhost ~]# grep -r "xiaomi" . ==》不接*也可以
./lianxi/0326/phone.txt:xiaomi
./.bash_history:bash position.sh lihua lihong xiaomei hanmeimei xiaoming fanyouyou fengtingting
./.bash_history:bash position.sh lihua lihong xiaomei hanmeimei xiaoming fanyouyou fengtingting
./.bash_history:bash position.sh lihua lihong xiaomei hanmeimei xiaoming fanyouyou fengtingting
./lihua.txt:xiaoming
./.viminfo::%s /redmi/xiaomi/gc
./.viminfo::%s /xiaomi/redmi/g
./.viminfo::%s xiaomi/redmin/g
./.viminfo::5,7 s /xiaomi/redmi/g
./.viminfo::s 5,7/xiaomi/redmi/g
./.viminfo::s 5,7 /xiaomi/redmi/g
./.viminfo::s /xiaomi/redmi/g
./.viminfo::s /xiaomi/redmi
./.viminfo:? xiaomi
1.6【模式】^ 和 $
1. ^…… 以……开头
2. ……$ 以……结尾
3. ^ 在中括号里表示取反 ==》【举例】 [^rmf] 表示不是 r 或 m 或 f 的字符
这个方法和-v的选择:在具体的要求下,看哪个效果更好。
在中括号外表示以什么开头 ==》【举例】^[rmf]表示以 r 或 m 或 f 开头的字符
4. ^$ 表示空行(行内没有内容)
[root@localhost 0326]# cat passwd |grep "^root" ==》查找以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@localhost 0326]# cat passwd |grep "bash$" ==》查找以bash结尾的行
root:x:0:0:root:/root:/bin/bash
fzt:x:1000:1000::/home/fzt:/bin/bash
[root@localhost 0326]# cat /etc/passwd| grep "lihua[0-9][0-9][0-9]"
lihua321:x:1012:1012::/home/lihua321:/bin/bash
lihua100:x:1014:1014::/home/lihua100:/bin/bash
1. 找到含有lihua并后面接了三个数字的行
[root@localhost 0326]# cat /etc/passwd| grep "lihua[0-9][0-9][0-9]"
lihua321:x:1012:1012::/home/lihua321:/bin/bash
lihua100:x:1014:1014::/home/lihua100:/bin/bash
2. 找到空行
[root@localhost 0326]# cat white.txt
hello
lihua
[root@localhost 0326]# cat white.txt |grep -n "^$"
2:
3. 找到有效行
有效行:不是注释行,不是空行
[root@localhost 0326]# cat /etc/ssh/sshd_config |egrep -v "^#|^$"
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
1.7【选项】-E
egrep 和 grep -E 等价
支持扩展正则==》支持更多的元字符
找到以root或者以li开头的行
[root@localhost 0326]# cat passwd |grep "^root|^li"
[root@localhost 0326]# cat passwd |grep -E "^root|^li"
root:x:0:0:root:/root:/bin/bash
lilanqing:x:1001:1001::/home/lilanqing:/bin/bash
lihua:x:1008:1008::/home/lihua:/bin/bash
liangluyao:x:1010:1010::/home/liangluyao:/bin/bash
lihua321:x:1012:1012::/home/lihua321:/bin/bash
1.7.1 正则表达式
是由字符串+数字+特殊符号,按照正确的规则组合而成的,用来表达某个意思的公式。
基本正则:包含很多常见的正则,如 ^ $ [0-9] [a-z] ^$
扩展正则:在基本正则的基础上新加了很多新的元字符,如 |(或者) + { } ?
【举例】cat passwd |grep -E "^root|^li"
【解释】如果不加 -E 那就会将|识别为普通字符串,无法获取他的特殊含义。
.* 在正则里表示任意字符
. 任意单个字符
\. 表示点(\用于转义)
xy{n} 表示xyyyyy……(y连续出现n次)
xy{2} 表示xyy
[x]{n} 表示x中的内容连续出现n次
[0-9]{2} 表示从0到9中取两次数字,任意取哪个数字
[0-9]{1,5} 表示从0到9中取2次到5次,任意取哪个数字,至少2次,至多5次
[0-9]{2,} 表示表示从0到9中取2次以上,至少两次
1.7.2 单词界定符号
\< 单词以什么开头
\> 单词以什么结尾
\b 可以取代\< 和 \>
1.8【选项】-A
显示匹配内容所在行,及其后面行 after
[root@localhost 0326]# cat phone.txt |grep -A 2 huawei
huawei
HUAWEI
oppo OPPO vivo
1.9【选项】-B
显示匹配内容所在行,及其前面行 before
[root@localhost 0326]# cat phone.txt |grep -B 2 huawei
xiaomi
XIAOMI
huawei
1.10【选项】-C
显示匹配内容所在行,及其前面行和后面行
[root@localhost 0326]# cat phone.txt |grep -C 2 huawei
xiaomi
XIAOMI
huawei
HUAWEI
oppo OPPO vivo
1.11【选项】-w
单词界定
-w, --word-regexp
Select only those lines containing matches that form whole words.
【举例】egrep -w "[a-Z]{16}" 等价于 egrep "\b[a-Z]{16}\b"
二、wc
用来统计一个文件里有多少行,多少单词,多少字节数
[root@localhost 0328]# cat phone.txt |wc
14 22 192
[root@localhost 0328]# wc < phone.txt
14 22 192
[root@localhost 0328]# wc phone.txt
14 22 192 phone.txt
[root@localhost 0328]# wc -l phone.txt
14 phone.txt
[root@localhost 0328]# cat phone.txt |wc -l ==》一般都会选择和管道配合使用,因为这样不会显示文件名
14
2.1 选项
-c (count)统计字节数
-l (lines)统计行
-w(world)统计单词数
三、diff
比较两个文件之间的差异,输出结果为两个文件的不同之处
当没有输出内容时,表示两个文件相同,该条命令的返回值为0.当有不同时,返回值为非0
【选项】
-u 将不同的地方放在一起,紧凑易读
-r 递归比较目录下的所有文件
[root@localhost 0328]# cp /etc/passwd .
[root@localhost 0328]# cp /etc/passwd passwd.backup
[root@localhost 0328]# vim passwd
[root@localhost 0328]# diff passwd passwd.backup
6d5
< lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ==》< 表示这是左边文件比右边文件多的内容
9,11d7
< shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
< halt:x:7:0:halt:/sbin:/sbin/halt
< mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@localhost 0328]# cp phone.txt phone.backup
[root@localhost 0328]# diff phone.txt phone.backup ==》没有输出表示两个文件相同,此时返回值为0
[root@localhost 0328]#
3.1 diff输出内容解释
[root@localhost 0328]# diff phone.txt phone.backup ==》此时,phone.txt和phne.backup只修改了一个单词
1c1
< haxiaomi
---
> xiaomi
[root@localhost 0328]# diff -u phone.txt phone.backup
--- phone.txt 2022-03-28 06:58:44.827437137 +0800 ==》- 表示左边文件
+++ phone.backup 2022-03-28 06:49:18.638186797 +0800 ==》+ 表示右边文件
@@ -1,4 +1,4 @@ ==》表示左边文件1到4行和右边文件1到4行有差异
-haxiaomi ==》具体差异为:左边文件是haxiaomi,右边文件为xiaomi
+xiaomi
XIAOMI
huawei
HUAWEI
3.2 将文件备份,一段时间后,如何判断文件是否被修改
- diff
- 查看访问时间(stat)
- md5sum:根据文件里的内容,计算md5值。如果文件被修改,那md5值将会发生改变。md5值不同,则文件不同
[root@localhost 0328]# md5sum passwd
8dde3c7ce53d5b82ecd90692081eb954 passwd
[root@localhost 0328]# md5sum passwd.backup
f0af5d20dfadf7dfcf426b38d35e75cb passwd.backup
[root@localhost 0328]# md5sum phone.txt
89fe5a9475bc82530515cd7a8bfd5a75 phone.txt
[root@localhost 0328]# md5sum phone.backup
89fe5a9475bc82530515cd7a8bfd5a75 phone.backup
3.3 补丁
程序更新了部分。
发现漏洞后,需要编写弥补这个漏洞的程序。这个弥补漏洞的程序就是补丁。
3.3.1 生成补丁
将test_v2.sh和test.sh的差异重定向到一个文件里,这个文件就是补丁文件
[root@localhost 0324]# cp test.sh test_v2.sh
[root@localhost 0324]# vim test_v2.sh
[root@localhost 0324]# diff test.sh test_v2.sh
4a5
> echo "好久不见"
[root@localhost 0324]# diff test.sh test_v2.sh >test.patch ==》生成补丁包
[root@localhost 0324]# ls
test.patch
3.3.2 打补丁
安装patch
[root@localhost 0324]# yum install patch -y
[root@localhost 0324]# patch test.sh < test.patch ==》将补丁包test.patch打到teset.sh文件
patching file test.sh
[root@localhost 0324]# diff test.sh test_v2.sh ==》对比发现是否还有差异,发现没有了
[root@localhost 0324]#
四、补充命令【练习】
5.1 bc
是Linux里的计算器,支持小数和整数运算
运算)可以进行整数之间的运算,小数之间的运算,以及整数和小数的混合运算(除了比较比较运算)
【注】双圆括号(())只能进行整数运算
5.1.1 输出值和返回值
输出的值:程序运行的过程中的输出内容而已
返回值:命令执行是否成功
函数返回值:return ==》默认返回值是0
脚本返回值:exit ==》用于退出脚本,后面不接数字,默认返回值是0
5.1.2 bc的两种使用方式
==通过管道
[root@localhost 0328]# echo 4.3 + 62.5 |bc
66.8
==直接使用,输入quit退出
[root@localhost 0328]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
8.2+6.1
14.3
quit
5.1.3 bc的输出值和返回值
两个数字不论谁打谁小,bc都进行了计算,所以命令返回值为0,表示命令执行成功
echo出来的值为表达式的执行结果,1表示该表达式正确,0表示该表达式错误
[root@localhost 0328]# echo "11.1 > 10.2" |bc
1
[root@localhost 0328]# echo $?
0
[root@localhost 0328]# echo "1.1 > 10.2" |bc
0
[root@localhost 0328]# echo $?
0
5.1.4 将输出的内容赋值给变量
===方法一:使用反引号
[root@localhost 0328]# num=`echo "1.1 + 10" |bc`
[root@localhost 0328]# echo $num
11.1
===【推荐】方法二:使用 $()
[root@localhost 0328]# num1=$(echo "1.1 + 10" |bc)
[root@localhost 0328]# echo $num1
11.1
5.2 [ ]
5.2.1 -eq
equal 相等
判断两个整数是否相等
[root@localhost 0328]# [ 3 -eq 3 ]
[root@localhost 0328]# echo $?
0
[root@localhost 0328]# [ 3 -eq 30 ]
[root@localhost 0328]# echo $?
1
5.2.2 -gt
great than 大于
5.2.3 -lt
less than 小于
5.2.4 -ge
大于等于
5.2.5 -le
小于等于
5.2.6 -ne
不等于
5.3 awk
也可以实现小数计算,是文本处理的命令。
和sed一样,是一行一行的读取、处理。
sed作用于一整行的处理,而awk将一行分成数个字段来处理。
5.3.1 awk命令的简要处理流程
5.3.2 awk的数据字段变量和-F选项
5.3.3 awk命令的完整语法
BEGIN和END部分只是执行一次
中间部分每一行都执行一次
【举例】
[root@localhost ~]# awk -F: 'BEGIN{print "####start#####"} $3>1000 {print $1,$3,$7} END{print "####end#########"}' /etc/passwd
####start#####
lilanqing 1001 /bin/bash
feng 1002 /bin/bash
lihua100 1014 /bin/bash
####end#########
[root@localhost ~]# awk 'BEGIN{print 49 - 23.4}'
25.6
%.2f\n 指定awk计算的进度,小数点后两位
[root@localhost ~]# a=30
[root@localhost ~]# b=10
[root@localhost ~]# awk 'BEGIN{printf "%.2f\n",'$a'/'$b'}'
3.00
5.3.4 NR和NF
NR 是awk里表示每行的行号 number of record 记录的行号,一行就是一条记录
NF 是awk里表示一行有多少个字段数 number of fired
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1819 228 1052 97 538 1328
Swap: 2047 0 2047
[root@localhost ~]# free -m|awk 'NR==2{print $3/$2}'
0.125344
5.4 多进程思想
串行:一个一个一次执行,速度慢
并行:同时执行,速度快(多进程)
(命令)& 在后台产生子bash进程去执行命令,放到后台执行 ==》{命令}&同功能
5.4.1 父进程和子进程的问题
当父进程结束时,会给发出信号,告诉内核杀死所有子进程
【解决】
使用wait,父进程等待所有子进程执行完后再退出,防止父进程比子进程提前执行完,然后杀死了所有子进程,导致子进程没有执行完成。