Day03-linux四剑客
一、Linux 三剑客
1、grep (老三) 过滤筛选信息
例如:筛选2.txt 文件中com的信息
1 [root@localhost ~]# grep "com" 2.txt 2 www.mmm.com 3 www.111.com
-A -B -C 加上阿拉伯数字
-A 是显示匹配后和它后面的n行
-B 是显示匹配行和它前面的n行
-C 是匹配行和它前后各n行
-c 统计出现次数
1 [root@localhost ~]# grep -B 2 "com" 2.txt 2 #www.baidu.Neal 3 #www.baidu.Neal 4 www.mmm.com 5 www.111.com
1 [root@localhost ~]# grep -A 2 "com" 2.txt 2 www.mmm.com 3 www.111.com 4 www.2222.con 5 www.3333.com 6 www.wewe.chk 7 www.sina.cn
1 [root@localhost ~]# grep -C 2 "com" 2.txt 2 #www.baidu.Neal 3 #www.baidu.Neal 4 www.mmm.com 5 www.111.com 6 www.2222.con 7 www.3333.com 8 www.wewe.chk 9 www.sina.cn
1 [root@localhost ~]# grep -c "com" 2.txt 2 3
2、sed (老二)修改替换文件内容、擅长对文件中的行进行操作
-n选项:只显示匹配处理的行(否则会输出所有)(也就是关闭默认的输出)
-p选项:打印
1 [root@localhost ~]# sed -n "/com/p" 2.txt 2 www.mmm.com 3 www.111.com 4 www.3333.com
2.1、修改文件部分内容信息
sed s###g file 前面两个#中的是原内容,后两个#中的是替换的内容
sed -i s###g 改变文件内容(可将 -i 理解成insert)
vim替换内容 :%s#cn#sed#g
tr命令:替换内容 被替换的字符与替换的字符数必须是相等的
01、替换的内容字符数>修改后内容字符数 abcd>123
[root@localhost ~]# echo abcd | tr "abcd" "123"
1233
02、替换的内容字符数<修改后内容字符数 abc<1234
[root@localhost ~]# echo abcd | tr "abc" "1234"
123d
03、替换的内容字符数=修改后内容字符数 bac=123
[root@localhost ~]# echo abcd | tr "abcd" "1234"
1234
04、 极特殊情况
abcba 12345
a -1;b-2;c-3;b-4;a-5
替换效果:54345
1 [root@localhost ~]# echo 123 | tr "123" "abc" 2 abc
1 [root@localhost ~]# sed -i s#cn#sed#g 2.txt 2 [root@localhost ~]# cat 2.txt 3 #www.163.sed 4 #www.9ku.Neal
3、awk (老大) 擅长统计分析文件内容、擅长对文件中列进行操作
1 [root@localhost ~]# awk "/cn/" 2.txt 2 #www.163.cn 3 www.sina.cn
4、老四find快速查找数据信息命令
find 寻找路径范围 :
-tyep d 查找文件目录文件
-f 普通文件
-name 文件名称
find 路径信息 -type 文件类型 -name "文件名"
忽略大小写查找:find 路径信息 -tyep 文件类型 -iname "文件名"
根据数据大小查找文件数据:find 路径信息 -type -f -size +100
深入层次查找 find /oldboy -maxdepth 1 type f -name "文件名"
指定解压到某个路径:tar zxvf /tmp/oldboy.tar.gaz -C /oldboy
5、tree查看目录下的信息
tree -L 2 /etc/ 显示两层目录结构层级信息
tree -d / 显示目录中所有结构信息
6、tar zcvf 压缩
z :压缩的方式 为zip
c :创建压缩包
v: 显示压缩过程
f : 指定压缩包文件路径信息
tar zcvf 要存放的路径 | 指定要压缩的数据文件
检查是否压缩正常:移动源数据,使用压缩包恢复
解压:tar zxvf 压缩包的文件路径 | 要解压的路径
查看压缩信息:
1 [root@localhost ~]# tar tf /opt/test.backup 2 1.txt
tar命令排出不需要压缩的文件
1 [root@localhost oldboy01]# ll 2 total 0 3 drwxr-xr-x 2 root root 6 Sep 14 19:58 oldboy 4 -rw-r--r-- 1 root root 0 Sep 14 19:58 oldboy.avi 5 -rw-r--r-- 1 root root 0 Sep 14 19:58 oldboy.jpg 6 -rw-r--r-- 1 root root 0 Sep 14 19:59 oldboy.png 7 [root@localhost oldboy01]# pwd 8 /root/oldboy01 9 10 [root@localhost oldboy01]# tar zcvf /tmp/oldboy.tar.gz /root/oldboy01 --exclude=/root/oldboy01/oldboy.avi 11 tar: Removing leading `/' from member names 12 /root/oldboy01/ 13 /root/oldboy01/oldboy/ 14 /root/oldboy01/oldboy.jpg 15 /root/oldboy01/oldboy.png
首先编写好排除文件:
1 [root@localhost oldboy01]# cat /tmp/path.txt 2 /root/oldboy01/oldboy.png 3 /root/oldboy01/oldboy.avi 4 /root/oldboy01/oldboy.png
排出多个文件
1 [root@localhost oldboy01]# tar zcvf /tmp/oldboy.tar.gz /root/oldboy01 --exclude-from=/tmp/path.txt 2 tar: Removing leading `/' from member names 3 /root/oldboy01/ 4 /root/oldboy01/oldboy/ 5 /root/oldboy01/oldboy.jpg 6 [root@localhost oldboy01]# cat /tmp/path.txt 7 /root/oldboy01/oldboy.png 8 /root/oldboy01/oldboy.avi 9 /root/oldboy01/oldboy.png
压缩某目录下的所有.txt文件,并检查压缩文件是否正常、删除原有数据,在 恢复数据
find /root/oldboy -maxdepth 1 -type f -name "*.txt" | xargs tar zcvf /oldboy/oldboy.tar.gz
find /oldboy/ -type f -name "*.txt" | xargs tar zcvf /tmp/oo.tar.gz 恢复压缩文件 tar zxvf /tmp/oo.tar.gz -C /oldboy/ 另一种方法 tar zcvf /tmp/oo.tar.gz ‘find /oldboy/ -type f -name "*.txt"’
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部
xargs要处理的文件如果不是在结尾,需要加上 -i这个参数
在/var/log/下查找log文件,复制文件到/home/omc/ftl且把结果保存到/home/omc/ftl/logs.txt文件中
1 [root@localhost log]# find /var/log/*.log -type f | xargs -i cp {} /home/omc/ftl 2 [root@localhost log]# ll -ltr /home/omc/ftl 3 [root@localhost log]# find /var/log/*.log -type f > /home/omc/ftl/logs.txt 4 [root@localhost log]# ll /home/omc/ftl/logs.txt
7、diff 对比文件差异
vimdiff 1.txt /etc/services
diff 1.txt /etc/services
二、for循环
批量创建用户
1、for num in {01..10};do useradd Neal$num;done
2、 echo 123456 | passwd -- stdin 用户名 (可以使用分号;连接两个命令)
三、正则表达
1、. 点符号
匹配任意一个字符,且只有一个字符
例如:grep "." oldboy01.txt -o 显示匹配过程
星符号*
匹配任意0和或多个以上连续的字符
匹配前一个字符连续出现了0次或者多次
.* 点和星结合
匹配任意所有信息
1 [root@localhost oldboy]# grep "^b.*i$" oldboy01.txt 2 bai
\ 转义符号:
将文件中的以,结果的信息进行过滤
将没有意义的信息转义普通信息进行识别
将没有意思的信息转义为有特殊意义的信息
\n 换行符号
\r 换行符号
\t 制表符号
echo -e "test01\ntest02" >> test.txt 扩展
2、括号符号:[]
匹配多个字符信息(一个字符匹配)
1 [root@localhost oldboy]# grep "^[wwwb]" oldboy01.txt 2 boy name neal 3 www.baidu.com;9ku.com
排 除符号:^
括号和尖号组合[^] 排除abc信息 grep "[^abc]"
扩展正则符号:默认grep sed 不能直接识别
grep提升自己egrep/grep -E
sed提升自己sed -r
3、+号符号:
表示前一个字符连续出现了1次或多次以上
1 [root@localhost oldboy]# egrep "0+" oldboy01.txt 2 0011 3 0101
4、| 竖线符号
并且符号,用于匹配多个信息(一个字符串匹配)
括号符号()
1、指定信息进行整体匹配
1 [root@localhost oldboy]# grep -E "oldb(oe)y" oldboy01.txt 2 my god ,i am not oldboey,but 3 4 ()将里面的信息看做整体
2、进行后项引用前项使用 \1 保留前项,引用
1 [root@localhost oldboy]# echo oldboy{01..04} | xargs -n1 2 oldboy01 3 oldboy02 4 oldboy03 5 oldboy04
[root@localhost oldboy]# echo oldboy{01..04} | xargs -n1 | sed -r 's#(.*)#useradd \1#g' useradd oldboy01 useradd oldboy02 useradd oldboy03 useradd oldboy04
[root@localhost oldboy]# echo oldboy{01..04} | xargs -n1 | sed -r 's#(.*)#useradd \1#g'|bash 批量创建用户
1 [root@localhost oldboy]# seq -w 5 2 01 3 02 4 03 5 04 6 05 7 批量设置用户密码
1 [root@localhost oldboy]# seq -w 10 | sed -r 's#(.*)#useradd oldboy\1;echo 123456 |passwd --stdin oldboy\1#g' 2 useradd oldboy01;echo 123456 |passwd --stdin oldboy01 3 useradd oldboy02;echo 123456 |passwd --stdin oldboy02 4 useradd oldboy03;echo 123456 |passwd --stdin oldboy03 5 useradd oldboy04;echo 123456 |passwd --stdin oldboy04 6 useradd oldboy05;echo 123456 |passwd --stdin oldboy05 7 useradd oldboy06;echo 123456 |passwd --stdin oldboy06 8 useradd oldboy07;echo 123456 |passwd --stdin oldboy07 9 useradd oldboy08;echo 123456 |passwd --stdin oldboy08 10 useradd oldboy09;echo 123456 |passwd --stdin oldboy09 11 useradd oldboy10;echo 123456 |passwd --stdin oldboy10
将输出的信息
echo 123456==> 转换为 <123456>进行显示
[root@localhost oldboy]# echo 12345 | sed -r 's#([1-5])#<\1>#g' <1><2><3><4><5> [root@localhost oldboy]# echo 12345 | sed -r 's#([1-5]+)#<\1>#g' <12345>
echo 123456==> 转换为<12><34><56>
1 [root@localhost oldboy]# echo 123456 | sed -r 's#(12)(34)(56)#<\1><\2><\3>#g' 2 <12><34><56>
3、括号符号:{}
可以指定字符连续匹配的次数
x{n,m} 表示前一个字符至少连续出现n次,最多出现m次
1 [root@localhost oldboy]# grep -E "0{2,3}" oldboy01.txt 2 0011
x{n,} 表示前一个字符至少连续出现n次,最多出现多少次不限制
1 [root@localhost oldboy]# grep -E "0{2,}" oldboy01.txt 2 0011 3 000000000 4 0000
x{,m}: 表示前一个字符至少连续出现0次,最多出现m次
1 [root@localhost oldboy]# grep -E "0{,2}" oldboy01.txt -o 2 00 3 0 4 0 5 00
4、问号符号?
定义匹配前一个字符出现0或者1次
总结:
* 匹配前一个字符出现0次或者多次
+ 匹配前一个字符出现1次或者多次(连续)
{} 匹配前一个字符指定出现多少次,至少0次
?匹配前一个字符出现0次或者1次
1 [root@localhost oldboy]# ip addr show ens33 | grep -E "[0-9]+.[0-9]+.[0-9]+.[0-9]+" -o | head 2 -1 3 192.168.145.132 4 5 查看ip
1 [root@localhost oldboy]# ip addr show ens33 |egrep "([0-9]+\.[0-9]+){3}" -o | head -1 2 192.168.145.132 3 4 取出IP地址
===================================================================================================================================================
1 课程知识回顾 2 1) 正则符号 3 基础正则符号: 4 ^ 以什么开头的信息进行匹配 ^oldboy 5 $ 以什么结尾的信息进行匹配 oldboy$ 6 ^$ 表示匹配空行信息 7 . 匹配任意一个且只有一个字符 grep "." 8 * 匹配前一个字符连续出现0次或者多次 9 .* 匹配所有任意信息 类似于通配符* 10 \ 将有意义的字符信息,转义成普通字符进行识别 11 --> 找出文件中以点结尾的信息 12 将特殊的扩展正则符号,转换成基础正则符号 13 将没有意义的字符信息转成有意义的字符 14 \n \r \t 15 [] 匹配多个字符信息,多个字符匹配时,是或者的关系 16 [ok] 在文件中找有O的字符信息 找文件中有k的字符信息 17 PS: 将一个字符串信息,进行拆分成一个一个的字符进行匹配 18 [^] 对匹配的字符信息进行排除 19 [^ok] 在文件中找有O的字符信息 找文件中有k的字符信息,进行排除不要显示,显示其他信息 20 [^o^k] 21 22 扩展正则符号: 23 + 匹配前一个字符连续出现1次或者多次 24 | 利用竖线可以匹配多个字符串信息 25 () 将多个字符信息汇总成整体,进行过滤 26 进行后项引用前项 (oldboy) \1--sed 27 {} 指定匹配前一个字符连续出现了多少次 28 {n,m} 至少连续n次,最多连续m次 29 {n} 匹配只连续n次的信息 30 {n,} 至少连续n次,最多不限 31 {,m} 至少连续0次,最多m次 32 ? 匹配前一个字符连续出现0次或者1次 33 34 grep命令识别扩展正则: egrep -E 35 sed命令识别扩展正则: sed -r