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命令是重点

浙公网安备 33010602011771号