文本处理工具和正则表达式

文本常见处理工具
1.cat
cat可以查看文本内容
-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
 
2.nl
显示行号,相当于cat-b
 
3.tac
逆向显示文本内容
 
[10:44:34 root@aiyoubucuo ~]$cat ybw
123456
yang
[10:44:44 root@aiyoubucuo ~]$tac ybw
yang
123456
4.rev
将同一行的内容逆向显示
[10:44:34 root@aiyoubucuo ~]$cat ybw 123456 yang 
[10:45:24 root@aiyoubucuo ~]$rev ybw 654321 gnay
 
5.hexdump
查看文件十六进制
 
[10:54:19 root@aiyoubucuo ~]$hexdump -C /etc/issue
00000000  5c 64 20 5c 6d 20 5c 6e  20 5c 73 20 0a           |d m 
 s .|
0000000d
 
6.head
可以显示文件或标准输入的前面行
-c #  指定获取前#字节
-n # 指定获取前#行,#如果为负数,表示从文件头取到倒数第#前
# 同上
[11:12:52 root@aiyoubucuo ~]$cat /dev/urandom |tr -dc '[:alnum:]'|head -c 12
1epM2tyuKq4F
 
7.tail
tail和head相反,查看文件或标准输入的倒数行
-c # 指定获取后#字节
-n # 指定获取 #行,如果#是负数,表示从第#行开始到文件结束
-# 同上
-f 跟踪文件名当文件删除再新建同名文件,将可以继续跟踪文件
[11:21:57 root@aiyoubucuo ~]$cat ybw|tail -n +3
3
4
5
6
8.cut
cut命令可以提取文本文件
-d指明分隔符,-f # :第#个字段,列如:3,第三列
[11:44:21 root@aiyoubucuo ~]$cat /etc/passwd|cut -d: -f1
root
bin
daemon
adm
lp
sync
shutdow
以冒号为分隔符,取第一列字段
 
9.paste
合并多个文件同行号的列到一行
-d # 分隔符:指定分隔符
-s 所有行合并成一行
[11:49:35 root@aiyoubucuo ~]$paste ybw yang 
1 a
2 b
3 c
4 d
5 e
6 f
[11:49:47 root@aiyoubucuo ~]$paste -d: ybw yang 
1:a
2:b
3:c
4:d
5:e
6:f
[11:50:23 root@aiyoubucuo ~]$paste -s ybw yang 
1 2 3 4 5 6
a b c d e f 
 
10分析文本工具
wc
收集文本统计数据
-l 只技术行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度
[11:51:06 root@aiyoubucuo ~]$cat /etc/passwd|wc -l
50
文件行数50行
 
11.sort
文本排序
-r 执行反方向由上至下整理
-R 随机排序
-n 执行按数字大小整理
-h 人类可读排序,如2k1G
-u 合并重复项,即去重

[16:07:58 root@centos7 ~]$df |tr -s ' ' '%'|cut -d% -f 5|tail -n +2|sort -rn
14
3
3
1
0
0
0
0

看出磁盘最高使用率
 
12.uniq
命令从输入中删除前后相接的重复的行
-c 显示每行重复出现的次数
-d 仅显示重复过的行
-u 进现实不曾重复的行

[16:08:56 root@centos7 ~]$df |tr -s ' ' '%'|cut -d% -f 5|tail -n +2|sort -rn|uniq -c
1 14
2 3
1 1
4 0

sort配合uniq使用
 
13.diff
比较文件之间的区别
-u 选项来输出"统一的(unified)"diff格式文件,最适合用于补丁文件
[14:54:40 root@aiyoubucuo ~]$diff -u ybw yang
--- ybw 2020-12-10 14:54:18.657174910 +0800
+++ yang 2020-12-10 14:53:19.613027594 +0800
@@ -1,5 +1,5 @@
nihao
-wang
+ybw
lili
-zhang
+xiaoming
 
15.扩展正则表达式
字符匹配元字符
. 任意单个字符
[yang] 指定范围的字符
[^yang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符 A-Z,a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符
[:space:] 水平和垂直的空白字符(比[:blank:]包含范围广)
[:cntrl:] 不可打印的控制字符 (退格,删除,警铃..)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
 
此时匹配
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
 
位置牟定
^ 行首
$ 行尾
<语首
>语尾
 
16.文本处理三剑客之grep
-m # 匹配#次后停止
-v 取反
-i 忽略大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-w 匹配整个单词
-E 使用扩展正则表达式,egrep
grep例子
[16:42:27 root@aiyoubucuo ~]$ifconfig | egrep -o '(([0-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])' 
10.0.0.8
255.255.255.0
10.0.0.255
127.0.0.1
255.0.0.0
192.168.122.1
255.255.255.0
192.168.122.255 
取出ip地址

[16:47:16 root@centos7 ~]$grep -nr 'PS' /etc/profile.d/
/etc/profile.d/bash_completion.sh:2:[ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION_COMPAT_DIR" ] && return
/etc/profile.d/colorls.sh:2:PS1="[e[1;36m][[e[0m] [e[1;32m]u[e[31m]@h[e[1;37m] W[e[1;35m]][e[0m]$"

可以根据字符查找在哪个文件里

 17.文本三剑客之sed

sed [选项] ... 'script;script;...' 输入文件..

-n 不输出模式空间内容到屏幕,即不自动打印

-e 多点编辑

-f file 从指定文件中读取编辑脚本

-r, -E 使用扩展正则表达式

-i.bak 备份文件并原处编辑

命令

p 打印当前模式空间内容,追加到默认输出之后

d 删除模式口空间匹配的行,并立即启用下一轮循环

a[]text 在指定行后面追加文本 ,支持

i[]text 在行前面插入文本

c[]text 替换行为单行或多行文本

s/pattern/string/修饰符  查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###替换修饰符

g 行内全局替换

p 显示替换成功的行

1.[16:36:02 root@centos7 ~]$sed -n '2p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
输出文件第二行

  2.[16:43:12 root@centos7 ~]$df |sed -n '/^/dev/sd/p'
  /dev/sda1 1038336 145256 893080 14% /boot

   取/dev/sd开头的行打印

  3.[16:48:30 root@centos7 ~]$seq 10 |sed -n '2,3p'
  2
  3

  取2至3行打印

[16:53:04 root@centos7 ~]$seq 10 |sed -n '2~2p'
2
4
6
8
10

取偶数行打印

[19:58:40 root@centos7 ~]#cat ybw
aaaaaaaaa
cccccccccccc
zzzzzzzzzzz

[20:02:03 root@centos7 ~]#sed -i '/a/as' ybw
[20:09:24 root@centos7 ~]#cat ybw
aaaaaaaaa
s
cccccccccccc
zzzzzzzzzzz

-i保存文件,a在指定行文本后追加文本,支持 实现多行追加

i行前,c代替行

sed -i '/^$/d' file

删除文件空行

[17:26:13 root@aiyoubucuo ~]#sed -nr 's/(r..t)/1er/p' /etc/passwd
rooter:x:0:0:root:/root:/bin/bash

替换,1代表括号内容r..t替换为r..ter

[19:29:44 root@aiyoubucuo ~]#echo a.b.c.gz |sed -nr 's/.*.([^.]+)$/1/p'
gz

取文件的前缀和后缀,前面是任意字符,结尾的意思是排除点一个或多个字符,前面.用转义符转译代表.gz括号取出结尾

[16:39:19 root@centos7 ~]$df |sed -nr '/dev/sda/s/.* ([0-9]+)%.*/1/p'
14

取以/dev/sda开头行的分区利用率

原文地址:https://www.cnblogs.com/aiyoubucuo/p/14116270.html