tr、wc、uniq、grep、diff

字符转换

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    ':'   '
' <fuxingkai.txt 
将文件中的:全部替换为换行

tr的作用二:删除

tr -d  [0:9]  删除09的数字    
tr -d  ‘%’    删除%字符

tr的作用三:压缩(去重)

tr -s  SET        
将连续相同的字符压缩成一个字符
# echo "1   2   3  4"|tr -s ' '  '	'
1    2    3    4
(	  代表制表符)

单引号和双引号的不同

  • 单引号:输出纯字符,特殊符号失去作用;
  • 双引号:元字符可以有特殊含义。
# 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
原文地址:https://www.cnblogs.com/lpeng94/p/12546511.html