字符转换
tr 的作用一:替换(不改变源文件)
作用:字符转换工具
只能对stdin操作,不能直接对文件操作
格式: tr set1 set2 (同一位置set2替换set1)
例① 普通的替换
# echo 123456123456|tr 345 abc
12abc612abc6
例② 在文本里的替换
# tr heze jinan < fuxingkai.txt
fuxingkai njongyiyang
jana
laarning linux
所以,并不能单词替换单词,仅仅是单个字符的一一对应替换!
例③ [ ]中括号表示范围的替换
# tr [a-z] [A-Z] <fuxingkai.txt
FUXINGKAI ZHONGYIYANG
HEZE
LEARNING LINUX
例④:
# tr ':' '\n' <fuxingkai.txt
将文件中的:全部替换为换行
tr的作用二:删除
tr -d [0:9] 删除0至9的数字
tr -d ‘%’ 删除%字符
tr的作用三:压缩(去重)
tr -s SET
将连续相同的字符压缩成一个字符
# echo "1 2 3 4"|tr -s ' ' '\t'
1 2 3 4
(\t 代表制表符)
单引号和双引号的不同
- 单引号:输出纯字符,特殊符号失去作用;
- 双引号:元字符可以有特殊含义。
# meinv=qianqian ---定义变量meinv,赋值qianqian
# echo "$meinv" ---输出meimv的值
qianqian
# echo '$meinv' ---输出$meinv
$meinv
$ 元字符:能代表其他含义的字符,有特殊含义的字符,并不是代表本身字符的含义。
sort命令(不改变源文件)
作用:排序。默认按每行的第一个字符排序。
- -n:按数值大小进行排序;
- -r:递减排序(整行整行的处理) reverse;
- -k 3 指定第三列为排序键;
- -t: 指定字段分割符(默认分隔符是空白(空格、Tab))。
PS:
sort排序是按照行来排序的,可以理解为一行是一个整体!!
uniq命令
数据的实例统计。
作用:删除经过排序后的数据的重复记录。通常和sort连用。sort -n 文件 | uniq
- -c:统计特定记录出现的次数;
- -u:只显示唯一的行;
- -d:只显示重复的行。
# cat access_log |awk '{print $1}'|sort |uniq -c|sort -nr|head -3 ---只取第一列
666 172.16.68.155
648 172.16.70.199
490 172.16.88.88
cut命令(截取)
从文本文件或者文本流中提取文本列
格式:cut -选项 提取范围 文本文件常见选项
- -c:从指定提取范围中提取字符;
- -f:从指定提取范围中提取字段(=列);
- -d:指定分隔符默认是Tab。
#cut -d “:” -f 1,7 /etc/passwd
#who | cut -d ' ' -f1,6 提取范围
- n:第n项;
- n-:第n项到行尾;
- -m:行首到第m项;
- n,m:第n项和第m项—单个的截取;
- n-m:第n项到第m项。
# cat name.txt |cut -c 2
将文件里的每一行的第2个字符截取出来
u
1
1
2
3
# cat name.txt |cut -c 2-5 截取第2个字符到第5个字符
umbe
12
11
2
3
# cat name.txt |cut -c -10 ---行首到第十项
number nam
112 l
111 l
22 zh
23 de
# cat name.txt |cut -c 5- ---第五项到末尾
er name age address phone
liu 18 shandong 123
li 20 hennan 345
zhang 16 beijing 789
deng 86 hubei 467
# cat name.txt
number name age address phone
112 liu 18 shandong 123
111 li 20 hennan 345
22 zhang 16 beijing 789
23 deng 86 hubei 467
# cat name.txt |tr -s " "|cut -d " " -f 3
age
18
20
16
86
# cat name.txt |tr -s " "|cut -d' ' -f3
age
18
20
16
86
小结
- tr
- -d 删除;
- -s 去重。
- sort
- -n 按数值大小排序;
- -k3 指定第三列为排序列;
- -r 递减。
- uniq
- -c 提取字符;
- -f 提取字段(==列);
- -d ‘%’ :按%来分隔字段。
练习
①只显示/etc/fstab文件的第三列
# cat /etc/fstab|tr -s " "|cut -d ' ' -f3
②用du -a只显示/boot目录下对象的占用空间,并按由小到大排序
# du -a /boot|cut -f1|sort -n
③只显示网卡eth0的IP地址
#ip add|tail -3|head -1|tr -s ' '|cut -d ' ' -f3
④用fdisk -l命令只显示出分区和文件系统的类型
# fdisk -l|grep ^/dev/|tr -s " "|cut -d " " -f 1,7
/dev/sda1 Linux
/dev/sda2 LVM
或
# fdisk -l|grep ^/dev/|awk '{print $1,$7}'
/dev/sda1 Linux
/dev/sda2 LVM
⑤统计/etc/passwd文件中sbin这个单词出现多少次
# cat /etc/passwd|grep -o sbin --color|wc -l
--color 匹配的字符串显示颜色
-o 只是显示匹配的字符串,其他的都不显示
正则表达式:
按照某种正常的规则组合起来的一个表达式,此表达式包含特殊字符+字符+数字等,用来表示一个特定的含义。
- 基本正则:特殊字符比较少;
- 扩展正则:元字符比较多,新加入了一些进来。
例:
# cat /etc/fstab |grep -E -v "^#|^$"
不显示以#开头的行或者空行
grep命令(相当于过滤)
格式:grep -[acinv] ‘搜索内容串’ filename
- -a:以文本文件方式搜索;
- -c:计算找到的符合行的次数;
- -i:忽略大小写;
- -n:顺便输出行号;
- -o:只显示匹配的内容;
- -v:反转查找,输出与模式不相符的行 -v, –invert-match;
扩展
- -E:支持扩展正则表达式。
[root@chinaitsoft lianxi]# cat fruit.txt |grep -i apple
apple
orange APPLE
peach APPLE 456
[root@chinaitsoft lianxi]#
PS:
egrep==grep -E ,效果一样。
在/lianxi目录下查找文件内容里包含apple的文件,显示出来:
# grep -r apple /lianxi
/lianxi/shuiguo.txt:apple
/lianxi/fruit.txt:apple
Binary file /lianxi/gcc-c++-4.4.7-4.el6.x86_64.rpm matches
wc 统计命令
- -l:统计行数;
- -w:统计单词数 (前后都是空白的一组字符);
- -c:统计字符数(可见和不可见的字符)。
- -
练习
1、查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。
# cat passwd|grep -E "^ftp|^mail"
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
2、查找出当前passwd文件中首行不是以r、m、f开头的行,在屏幕上输出。
# cat passwd |grep -E -v "^r|^m|^f"
(或"^[rmf]")
[rmf] 代表r或者m或者f中的一个。
[a-z] 代表从a-z,中间很多字符
3、查找出当前passwd文件中以bash结尾的行。
# cat passwd |grep -E "bash$"
4、查找出/etc/login.defs文件中的有效行(不显示空行和注释行)。
# cat /etc/login.defs |grep -E -v "^$|^#"
diff命令:文件差异对比
diff命令:
比较两个文件之间的差异,输出结果为两个文件的不同之处。
diff命令的输出格式:
- -u:会将不同的地方放在一起,紧凑易读;
- -r: 递归比较目录下的所有文件;
- 利用diff命令生成补丁。
文件和文件的比较:
# diff -u chinaitsoft.txt chinaitsoft_v2.txt
--- chinaitsoft.txt 2016-01-17 00:53:23.093940085 +0800
+++ chinaitsoft_v2.txt 2016-01-17 00:51:25.747839493 +0800
@@ -1,4 +1,6 @@ ---@@代表一段范围
jinan -代表第一个文件
+changqing
linux
chinasotf
+teacher feng
# diff -u chinaitsoft.txt chinaitsoft_v2.txt >v1-to-v2.patch
生成补丁,补丁叫作v1-to-v2.patch
patch 打补丁命令
用途:用来打补丁修补文件
格式:patch [选项] 原始文件 < 补丁文件
- -pN: N表示忽略N层路径;
- -R: 还原到老版本。
注意事项: - 如果打多个补丁,注意先后顺序;
- 打补丁前不要修改源文件。
# patch chinaitsoft.txt <v1-to-v2.patch
patching file chinaitsoft.txt
# diff chinaitsoft.txt chinaitsoft_v2.txt
还原到原来的版本--->撤销打补丁
# patch -R chinaitsoft.txt <v1-to-v2.patch
patching file chinaitsoft.txt
# diff chinaitsoft.txt chinaitsoft_v2.txt
1a2
> changqing
3a5
> fenglaoshi
目录和目录的比较
1.新建目录及子目录和普通的文件
[root@chinaitsoft lianxi]# mkdir qq
[root@chinaitsoft lianxi]# cd qq/
[root@chinaitsoft qq]# ls
[root@chinaitsoft qq]# cp /etc/hosts .
[root@chinaitsoft qq]# ls
hosts
[root@chinaitsoft qq]# mkdir image sound
[root@chinaitsoft qq]# ls
hosts image sound
[root@chinaitsoft qq]# cd image/
[root@chinaitsoft image]# ls
[root@chinaitsoft image]# echo 123 >1.txt
[root@chinaitsoft image]# ls
1.txt
[root@chinaitsoft image]#
[root@chinaitsoft image]# cd ..
[root@chinaitsoft qq]# ls
hosts image sound
[root@chinaitsoft qq]# cd sound/
[root@chinaitsoft sound]# echo "789" >3.txt
[root@chinaitsoft sound]# ls
3.txt
[root@chinaitsoft sound]# cd ..
[root@chinaitsoft qq]#
[root@chinaitsoft qq]# cd ..
2.生成一个升级版本的目录
-r 递归的去比较子文件夹里的内容
[root@chinaitsoft lianxi]# cp qq qqv2 -r
[root@chinaitsoft lianxi]# diff -ur qq qqv2
3.更新qqv2里的内容
[root@chinaitsoft lianxi]# cd qqv2
[root@chinaitsoft qqv2]# ls
hosts image sound
[root@chinaitsoft qqv2]# cp /etc/passwd .
[root@chinaitsoft qqv2]# ls
hosts image passwd sound
[root@chinaitsoft qqv2]# cd sound/
[root@chinaitsoft sound]# echo "8900" >6.txt
[root@chinaitsoft sound]# cd ..
[root@chinaitsoft qqv2]# ls
hosts image passwd sound
[root@chinaitsoft qqv2]# echo "123456" >hosts
[root@chinaitsoft qqv2]# ls
hosts image passwd sound
[root@chinaitsoft qqv2]#
[root@chinaitsoft qqv2]# cd ..
[root@chinaitsoft lianxi]# diff -Nur qq qqv2
-N 如果没有文件,就拿一个空文件和别的目录里的文件比较。
比较文件夹生成补丁:
[root@chinaitsoft lianxi]# diff -Nur qq qqv2 >patch-v2.txt
/u/howard/src/blurfl/blurfl.c
-p3 的效果就是去掉第3个/前面的内容,效果如下:
src/blurfl/blurfl.c
-p4 的效果就是去掉第4个/前面的内容,效果如下:
blurfl/blurfl.c