RHCE第三周 文本处理工具

一:文本查看工具

cat,tac,more,less,head,tail,wc这些命令

1:cat和tac命令

cat这个命令就是从头到尾的显示完整的文件内容,tac就是从尾到头的显示文件内容

选项:

-n :就是可以显示行数和文件内容

-A:这个就是显示文件的不同点,可以看得到空格,这个非常的重要,就是在后面写shell脚本或者剧本的时候,可以比较有什么不同的点

2:案例:

1)将多个文件的内容合并到一个文件中去

[root@server opt]# cat file1 file2
file1
file2
[root@server opt]# cat file1 file2 > file3
[root@server opt]# cat file3
file1
file2
[root@server opt]# 

就是将内容覆盖的写入到file3这个文件里面去  

2)查看有多少行

[root@server opt]# cat -n passwd |head -10
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	operator:x:11:0:operator:/root:/sbin/nologin
[root@server opt]# 

3)-A,查看文件的特殊字符

[root@server opt]# cat -A 11.txt 
file1$
[root@server opt]# cat -A 22.txt 
file1 $
[root@server opt]#  

就是这个$就是以什么结尾的,22.txt就是以空格结尾的,就是文件的内容是相同的,但是就是不能执行,可能就是多打了一个空格,这个需要注意,可以作比较

 

2:more和less命令

这个2个命令都是按页来查看文件的,其中less可以在线的编辑文件,more不行

1:more命令

可以根据空格键和方向键的下键就是下一页,b键和方向键的上键就是上一页,回车就是下一行

案例:

[root@server opt]# more passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

2:less命令

可以在线编辑文件内容,搜索文件内容

案例:  

1)搜索root

按n|N 就是向下寻找|向上寻找

[root@server opt]# less passwd 
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
geoclue:x:991:986:User for geoclue:/var/lib/geoclue:/sbin/nologin
flatpak:x:990:985:User for flatpak system helper:/:/sbin/nologin
/root 

在末行模式下,/搜索的内容

2)编辑文本内容

按v键,再按i键,wq保存,q退出

3:head和tail命令

最常用的命令,就是不想显示完整的内容,可以使用

1:head命令

就是从头到尾的显示多少行,默认是10行

案例:

1)显示5行

[root@server opt]# head -n 5 passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server opt]# head -n +5 passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server opt]# 

都可以+5和不带上+

2)除了最后的10行其余都显示内容

[root@server opt]# head -n -10 passwd | cat -n

这个减号就是除了最后10行其余都显示出来

 

2:tail命令

就是从未到头的显示多少行

案例:

1)显示最后5行

[root@server opt]# tail -n -5 passwd 
tcpdump:x:72:72::/:/sbin/nologin
systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
q7:x:1000:1000:q7:/home/q7:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
memeda:x:1001:1001::/home/memeda:/bin/bash
[root@server opt]# tail -n 5 passwd 
tcpdump:x:72:72::/:/sbin/nologin
systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
q7:x:1000:1000:q7:/home/q7:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
memeda:x:1001:1001::/home/memeda:/bin/bash
[root@server opt]# 

2)显示除了前10行其余的都显示出来

[root@server opt]# tail -n +10 passwd  |cat -n 

第10行显示出来了所以还要加上1   tail -n +11 passwd | cat -n 

也可以这么理解从11行开始显示内容,前面的10行不显示内容

3)实时监控日志

tail -f这个命令,在排错的时候,非常的有用

 

结合使用:

就是显示第6行和第10行的内容

[root@server opt]# head -n 10 passwd |tail -n 5 
sync:x:5:0:sync:/sbin:/bin/sync
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
operator:x:11:0:operator:/root:/sbin/nologin

 就是先展示前10行的内容,再来展示10-6+1这个行,用tail来执行

 

二:文本过滤工具和文本处理工具

grep,sed,awk,cut,sort,diff这些命令

1:grep命令

这个命令非常的重要,在能够过滤出需要的东西出来

1:常见的选项

-i 忽略大小写
-o 只打印匹配出的关键字
-n 打印出行数
-c 打印出匹配的总行数
-q 静默输出(不输出任何的信息),用$?可以判断是否正确的执行了
-v 取反,就是取相反的结果
-r 递归的搜索,显示文件和文件内容
-l 只显示文件,不显示内容
-Ax 显示匹配到的行数的后面几行(after)
-Bx 显示匹配到行数的前面几行(before)
-Cx 显示匹配到行数的上下几行(center)
--color 就是对于匹配到的内容进行高亮显示

2:常规的案例

1)对于显示包含root的文件

[root@server mnt]# grep -rl root /mnt/
/mnt/11
/mnt/22
[root@server mnt]# 

2)只打印匹配到的内容,忽略大小写

[root@server opt]# grep -oi error /var/log/messages | head -n 10
ERROR
error
Error
Error
Error
Error
Error
Error
Error
Error
[root@server opt]# 

3)静默输出 

就是不显示在屏幕上,依靠$?的返回值来判断是否正常的运行了,为0就代表着正常的在运行,否则,就错误了

[root@server opt]# grep -q root qq
[root@server opt]# echo $?
0
[root@server opt]# 

4)Ax和Bx和Cx

#显示匹配到内容的后面
[root@server opt]# grep -A1 error 33
error:123
dasdadas
[root@server opt]# 
#显示匹配到内容的前面
[root@server opt]# grep -B1 error 33
sdsada
error:123
[root@server opt]# 
#显示匹配到上下的内容
[root@server opt]# grep -C1 error 33
sdsada
error:123
dasdadas
[root@server opt]# 

3:结合正则表达式  

就是能够对于文本精确的输出,实现更加复杂的过滤

1:常见的元字符:

^ 以这个开头的
$ 以这个结尾的
\< 以这个字开头的字
\> 以这个字结尾的字
. 就代表着匹配单个字符(任意的字)
[abc] 这个就是匹配abc中的任意一个字符
[^abc] 就是不匹配abc中的任意一个字符
[a-z] 匹配a-z里面的字符
\ 就是取消后面单个字符的特殊含义
* 就是对前面的字符进行0次或者多次的匹配
.* 匹配所有的字符,就是匹配任意字符0次或者多次

2:正则表达式的案例

1)匹配以root这个字开头的字,root结尾的字,只匹配root这个字

[root@server opt]# grep '\<root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server opt]# grep 'root\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server opt]# 
[root@server opt]# grep '\<root\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server opt]# 

2).和[abc]和[^abc]

#匹配r后面的任意字符
[root@server opt]# grep r. qq
root
roooot
rootaaa
rootbbb
rqqqqq
rorororotroror
[root@server opt]# 
#匹配到root其中的任意字符
[root@server opt]# grep [root] qq
root
roooot
rootaaa
rootbbb
rqqqqq
rorororotroror
[root@server opt]# 
#不匹配有q的字符
[root@server opt]# grep r[^q] qq
root
roooot
rootaaa
rootbbb
rorororotroror
[root@server opt]# 

r[^q]就是不能匹配到rq,其余的2位都可以匹配到

3)*和\

#匹配r0次或者多次
[root@server opt]# grep r* qq
root
roooot
rootaaa
rootbbb
rqqqqq
rorororotroror
dd
rototorrrr
[root@server opt]# 
#取消$?的特殊含义
[root@server opt]# echo $?
0
[root@server opt]# echo \$?
$?
[root@server opt]# 

  

4:扩展正则   

 就是使用grep -E 或者egrep命令就可以

1:常见的选项

+ 就是对前面一项匹配1次或者多次 
 ? 对前一项匹配0次或者1次 
 {j} 对前面一项匹配j次 
 {,j} 对前面一项最多匹配j次
 {j,} 对前面一项至少匹配j次 
 {j,k} 对前面一项至少匹配j次,最多匹配k次 
 a|b 可以匹配a或者b 
 (exp) 就是将exp最为一个整体来匹配 

 2:扩展正则案例

1)+和?  

[root@server opt]# egrep r+ qq
root
roooot
rootaaa
rootbbb
rqqqqq
rorororotroror
rototorrrr
[root@server opt]# egrep r? qq
root
roooot
rootaaa
rootbbb
rqqqqq
rorororotroror
dd
rototorrrr
[root@server opt]# 

2){j,k}  

[root@server opt]# egrep 'r{1,3}' qq
root
roooot
rootaaa
rootbbb
rqqqqq
rorororotroror
rototorrrr
[root@server opt]# 

3)a|b和(exp)

[root@server opt]# cat test 
file 
directory 
aaa 
dsfd
fdf

[root@server opt]# egrep 'file|directory' test
file 
directory 
[root@server opt]# 
[root@server opt]# egrep '(file)' test 
file 
[root@server opt]# 

4)匹配出ip地址(只能输出ip地址)

[root@server opt]# ifconfig |  egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | egrep -v '^255|255$'
192.168.20.10
127.0.0.1
[root@server opt]# 

 

总结:使用扩展正则的时候带上单引号,否则会报错  

  

2:cut命令  

 取出指定的字段和列数出来

1:选项

-d 以什么为分隔符
-f 指定列数
-c 指定取出的字段

2:案例

1)取出passwd这个文件里面的uid和gid

[root@server opt]# cut -d: -f3,4 passwd |head -n 5
0:0
1:1
2:2
3:4
4:7

2)取出1到第三个字符和取出第一个字符和第三个字符

[root@server opt]# cut -c1-3 passwd |head -n 5
roo
bin
dae
adm
lp:
[root@server opt]# cut -c1,3 passwd | head -n 5
ro
bn
de
am
l:
[root@server opt]# 

3)取出ip地址

[root@server opt]# ifconfig |grep netmask | cut -d " " -f 10
192.168.20.10
127.0.0.1
[root@server opt]# ifconfig | grep netmask | awk '{print $2}'
192.168.20.10
127.0.0.1

 

  

三:文本分析工具  

一:文本统计工具  

 wc常用的选项

-l 统计行数
-c 统计文件的大小
-w 统计单词的数量

案例:

 1)统计文件

[root@server opt]# wc passwd 
  39   90 2179 passwd
[root@server opt]# 

2)统计这个目录下有多少的文件

[root@server opt]# ll | wc -l
3
[root@server opt]# ls | wc -l
2
[root@server opt]#

ll命令统计文件的时候,会列出total这一列,所以要删除掉这一行

二:sort排序工具  

 1:sort常用的选项

-t 以什么为分隔符
-k 指定列数
-n 以数字来进行排序
-r 反向排序
-f 忽略大小写
-u 可以去掉重复内容

 2:案例

 1)根据uid来进行排序

[root@server opt]# sort -t: -k3 -n /etc/passwd|head -5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server opt]# 

2)去重复的内容  

[root@server opt]# cat ww 
user1
user2
user3
user3
user1
[root@server opt]# sort -u ww
user1
user2
user3
[root@server opt]# 

3)uniq命令去重的比较  

就是uniq这个命令是去掉相邻的重复的,不是相邻的去不掉

[root@server opt]# cat ww 
user1
user2
user3
user3
user1
[root@server opt]# uniq ww
user1
user2
user3
user1
[root@server opt]# 

uniq -c 可以看到重复的内容

三:文本比较工具  

diff命令和vimdiff

格式:

diff 比较的文件  原文件 

1:案例

1)比较

[root@server opt]# diff passwd qq
2a3
> qqqq
[root@server opt]# 

a就是添加,d就是删除,c就是修改

 

vimdiff的使用

[root@server opt]# vimdiff passwd qq 

有修改的颜色比较深一些

四:文本转换工具  

tr命令

可以进行大小写的字母的转换,数字和字母的转换,也可以删除某个特定的字符、

1:案例

1)将小写的字母转换成大写的字母

[root@server opt]# echo abc | tr 'a-z' 'A-Z'
ABC
[root@server opt]# 

2)将数字转换成字母

[root@server opt]# id root | tr '0' 'A'
用户id=A(root) 组id=A(root) 组=A(root)
[root@server opt]# 

3)删除某个字符(-d)

都只是屏幕输出,并没有对原文件进行修改

[root@server opt]# cat ww | tr -d user
1
2
3
3
1
[root@server opt]#  tr -d user  < ww
1
2
3
3
1
[root@server opt]# 

  

  

 

 四:sed命令

 简介:非常的牛逼这个命令,shell脚本中经常使用的命令,实现文本编辑的

1:sed基础

sed能够实现文本的插入,修改,删除等操作,他有一个模式空间,就是先将要处理的文本文件放到模式空间里面去,然后再来对这个模式空间里面的内容进行操作,默认不改变原文件

2:选项

-n 不输出模式空间的所有内容,只输出对哪个有操作的内容
-e 可以执行多个命令 -e  ' '   -e ' '
-r 可以使用正则表达式,扩展正则表达式
-f 可以使用脚本,就是先写好一个表达式
-i 对原文件进行修改

地址定界:这个就是指定处理的行数,或者指定关键字的一行或者几行

常见的地址定界

# #为数字,指定操作的行数
$ 表示最后一行
/regexp/I 通过匹配的关键字,可以结合正则使用,大写的I忽略大小写
\%regexp% 匹配的关键字里面有特殊的符号的话,使用这个,有多个的话,也使用这个
#1,#2 就是指定范围的行数,当然也可以使用关键字来指定行数(要配合正则一起来使用)
first~step 1~2,从第一行开始,以2为步长,来匹配

addr1,+N

addr1,-N

匹配addr1行,以及后面的N行

匹配addr1行到N行

 

常见的动作:

a(append) 在匹配的行后添加
i(insert) 在匹配的行前添加
d(delete) 删除指定行
c(change) 就是修改指定的行(一整行的修改)
s(set) 就是指定替换哪个关键字,所有的替换的话,加上g
p(print) 打印指定行
! 取反的动作
w 另存为(就多少行到多少行另存为到另外一个文件)
I 忽略大小写

 3:案例

 还是要多敲命令,才行,才能留下深刻的印象,才能永久的记忆

1)打印第10行的内容

[root@server opt]# sed -n '10p' passwd 
operator:x:11:0:operator:/root:/sbin/nologin

2)打印最后一行  

[root@server opt]# sed -n '$p' passwd 
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

3)匹配root这个关键字的行  

就是匹配到这个root这个关键字,然后打印出来

[root@server opt]# sed -n '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server opt]# 

4)匹配有特殊符号的关键字 

[root@server opt]# sed -n '\%/bin/bash%p' passwd 
root:x:0:0:root:/root:/bin/bash
q7:x:1000:1000:q7:/home/q7:/bin/bash
[root@server opt]# 

5)打印第1行和5行的内容

这个比使用head和tail命令简单多了

[root@server opt]# sed -n '1,5p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server opt]# 

6)使用关键字来指定范围的行数

匹配root开头和lp开头的行数来打印出来  

[root@server opt]# sed -nr '/^root/,/^lp/p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server opt]# 

7)first~step,指定步长

打印第一行然后以步长为2打印后面的行

[root@server opt]# sed -n '1~2p' passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
clevis:x:996:992:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/usr/sbin/nologin
sssd:x:995:991:User for sssd:/:/sbin/nologin

8)addr1,+N行-N行

#+N行
[root@server opt]# sed -n '1,+5p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
#-N行
[root@server opt]# sed -n '1,5p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

9)添加

2种方式,先指定行,再来添加,或者指定匹配的关键字

#a在行后添加
[root@server opt]# cat test
root
binbash
su
[root@server opt]# sed '1a\qqq\' test
root
qqq
binbash
su
[root@server opt]# sed '/root/a\qqq\' test
root
qqq
binbash
su
[root@server opt]# 

#i在行前添加
[root@server opt]# sed '1i\qqq\' test
qqq
root
binbash
su

10)修改 

#c是对一整行进行修改
[root@server opt]# cat test
root
binbash
su
[root@server opt]# sed '/root/c\qqqqqq\' test
qqqqqq
binbash
su
[root@server opt]# 

#s是对指定的关键字进行修改
[root@server opt]# cat test
root
binbash
su
[root@server opt]# sed 's/root/qqqq/g' test
qqqq
binbash
su
[root@server opt]# 

-g就是如果后面还有root的话,就也修改

11)除了第一行以外,其余都修改

[root@server opt]# cat test
root
binbash
su/root
root :; root
[root@server opt]# sed '1!s/root/qqqq/g' test
root
binbash
su/qqqq
qqqq :; qqqq
[root@server opt]# 

12)将第一行到第三行另存为qq.txt

[root@server opt]# cat test
root
binbash
su/root
root :; root
[root@server opt]# sed '1,3w/opt/qq.txt' test
root
binbash
su/root
root :; root
[root@server opt]# cat qq.txt 
root
binbash
su/root
[root@server opt]# 

 

 

总结:

多练多敲,这样就不会忘记,grep和sed和cut命令是重点 

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2024-01-10 17:27  q_7  阅读(17)  评论(0)    收藏  举报