目录
三、sed工具介绍
文本处理工具、读取文本内容、根据指定的条件进行处理、如删除、替换、添加等;可在无
交互情况下实现相当复杂的文本处理操作;被广泛用于Shell脚本,以完成自动化处理任务;sed依
赖于正则表达式。
1、Sed的工作流程
◆读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中
(又称模式空间,pattern space)。
◆执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否
则 sed 命令将会在所有的行上依次执行。
◆显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内
容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
2、sed基本语法
基本语法命令格式:sed [选项] '操作' 参数
或者:sed [选项] -f scriptfile 参数
◆sed命令常用选项有:
-e 或--expression=:表示用指定命令或者脚本来处理输入的文本文件。
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或--help:显示帮助。
-n、--quiet 或 silent:表示仅显示处理后的结果。
-i:直接编辑文本文件,而不输出结果。
◆“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”
操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进
行,则表示为“5,20 动作行为”。常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
c:更改,更改匹配行整行的内容为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打
印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换匹配指定字符。
y:字符转换。
n:读取下一行,遇到n时会自动跳入下一行。
g:全局操作
q:退出。 = :用来打印被匹配的行的行号。
◆参数一般有g,代表只要符合条件的全部进行处理
3、实际应用
⑴、输出指定的行
输出符合条件的文本(p 表示正常输出)。
[root@kang mytext]# sed -n 'p' xx.txt #将文件所有内容输出
he was short and fat.
He was wearing a blue polo shirt with black pants.
……
[root@kang mytext]# sed -n '2p' xx.txt #输出第 2 行的内容
He was wearing a blue polo shirt with black pants.
[root@kang mytext]# sed -n '3,5p' xx.txt #输出第3~5行的内容
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
[root@kang mytext]# sed -n '12,$p' xx.txt #输出第10行到末尾的所有行
#woood #
#woooooood
……
[root@kang mytext]# sed -n '1,+3p' xx.txt
#从第一行开始,连续3行进行输出(输出1~4行)。
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
[root@kang mytext]#
[root@kang mytext]# sed -n 'p;n' xx.txt #输出所有奇数行,n 表示读入下一行资料
he was short and fat.
The home of Football on BBC Sport online.
……
[root@kang mytext]# sed -n 'p;n' xx.txt #输出所有偶数行,n 表示读入下一行资料
he was short and fat.
The home of Football on BBC Sport online.
……
[root@kang mytext]# sed -n '8,13{p;n}' xx.txt #输出8~13行中的偶数行
a wood cross!
#woood #
[root@kang mytext]# sed -n '8,13{n;p}' xx.txt #输出8~13行中的奇数行
Actions speak louder than words
#woooooood
[root@kang mytext]# sed -n '7,13{p;n}' xx.txt #输出7~13行中的奇数行
PI=3.141592653589793238462643383249901429
Actions speak louder than words
#woooooood
[root@kang mytext]# sed -n '7,13{n;p}' xx.txt #输出7~13行中的偶数行
a wood cross!
#woood #
# AxyzxyzxyzxyzC
[root@kang mytext]#
[root@kang mytext]# sed -n '/The/p' xx.txt #输出包含The的行
The home of Football on BBC Sport online.
The year ahead will test our political establishment to the limit.
[root@kang mytext]# sed -n '1,/The/p' xx.txt
#将从第一行至第一个包含The的行进行输出
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
[root@kang mytext]# sed -nr '/wo{1,}d/p' xx.txt
#匹配不少于1次前导符号o,加-r参数支持扩展正则表达式
a wood cross!
#woood #
……
[root@kang mytext]# sed -n '/The\|wood/p' xx.txt #输出包含The或者wood的行
#注意:遇到特殊符号,扩展正则需要转义符“\”
The home of Football on BBC Sport online.
The year ahead will test our political establishment to the limit.
a wood cross!
……
[root@kang mytext]# sed -e '2q' xx.txt #输出前2行信息后退出,q退出
he was short and fat.
He was wearing a blue polo shirt with black pants.
[root@kang mytext]# sed -n '/The/=' xx.txt
#将包含The所在行的行号输出,=号用来输出行号
3
6
[root@kang mytext]#
⑵、插入符合条件的行
注意:如果要添加插入多行数据,除最后一行外,每行末尾都需要使用“\n”符合表示数据未完
结,换行。
[root@kang mytext]# sed 's/^/#/' xx.txt #每行行首插入#号
#he was short and fat.
#He was wearing a blue polo shirt with black pants.
……
[root@kang mytext]# sed 's/$/EOF/' xx.txt #每行行尾插入EOF
he was short and fat.EOF
He was wearing a blue polo shirt with black pants. EOF
……
[root@kang mytext]# sed '/The/a admin:1' xx.txt #在含有The行的下一行插入
……
The home of Football on BBC Sport online.
admin:1
……
[root@kang mytext]# sed '/The/i admin:1' xx.txt #在含有The行的前一行插入
he was short and fat.
He was wearing a blue polo shirt with black pants.
admin:1
The home of Football on BBC Sport online.
……
[root@kang mytext]# sed '2aASDFG' xx.txt #在第二行之后插入ASDFG
he was short and fat.
He was wearing a blue polo shirt with black pants.
ASDFG
……
⑶、删除符合要求的行
[root@kang mytext]# sed '1d' xx.txt #删除第一行
[root@kang mytext]# sed '$d' xx.txt #删除最后一行
[root@kang mytext]# sed '^$' xx.txt #删除所有空行
[root@kang mytext]# sed '2,4d' xx.txt #删除第2~4行
[root@kang mytext]# sed '/The/d' xx.txt #删除包含The的行
[root@kang mytext]# sed '/The/!d' xx.txt #删除不包含The的行,这里!为取反
[root@kang mytext]# sed '/^The/d' xx.txt #删除The开头的行
[root@kang mytext]# sed '/wood$/d' xx.txt #删除wood结尾的行
⑷、替换符合条件的文本
[root@kang mytext]# sed 's/the/The/' xx.txt #将文件中所有the替换成The
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
The tongue is boneless but it breaks bones.12!
google is The best tools for search keyword.
……
[root@kang mytext]# sed 's/l/L/2' xx.txt #将每行第二个l替换成L,
he was short and fat.
He was wearing a blue poLo shirt with black pants.
The home of FootbalL on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tooLs for search keyword.
The year ahead wilL test our political establishment to the limit.
……
[root@kang mytext]# sed '3,5s/the/The/g' xx.txt #将3-5行内的所有the替换成The
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
The tongue is boneless but it breaks bones.12!
google is The best tools for search keyword.
The year ahead will test our political establishment to the limit.
……
[root@kang mytext]# sed '/the/s/o/O/g' xx.txt #替换所有the行中的o替换成O
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tOngue is bOneless but it breaks bOnes.12!
gOOgle is the best tOOls fOr search keywOrd.
The year ahead will test Our pOlitical establishment tO the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
……
⑸、迁移符合条件的文本
常使用的选项有如下:
H:复制到剪贴板
g、G: 将剪贴板中的数据覆盖/追加至指定行
W:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
[root@kang mytext]# sed '/the/{H;d};$G' xx.txt #将包含the的行迁移至文件末尾
[root@kang mytext]# sed '1,5{H;d};18G' xx.txt #将第1-5行内容迁移到18行后
[root@kang mytext]# sed '1,5{H;d};$G' xx.txt #将第1-5行内容迁移到末尾
[root@kang mytext]# sed '/the/w file' xx.txt #将包含the的行另存为文件file
[root@kang mytext]# sed '/the/r /etc/hostname' xx.txt #将文件/etc/hostname的内容添加到包含the的每行后
……
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
kang
google is the best tools for search keyword.
……
H表示保存当前模式到一个缓存区,G表示取出保存的模式。
⑹、执行多次命令
[root@kang mytext]# sed -ne's/root/admin/' -ne's/bash/sh/p' /etc/passwd
#将root替换为admin,将bash替换为sh,
admin:x:0:0:root:/root:/bin/sh
kl:x:1000:1000:kl:/home/kl:/bin/sh
wangwu:x:1001:1001::/home/wangwu:/bin/sh
……
注:-e可以将多个命令连接起来,也可将多个命令保存到文件中。
⑺、使用脚本编辑文件
使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。
[root@kang mytext]# sed '1,5{H;d};18G' xx.txt #将第1-5行内容迁移到18行后
#或者可以调用编辑的文件来达到上述操作
[root@kang mytext]# vim 111.txt
1,5H
1,5d
17G
[root@kang mytext]# sed -f 111.txt xx.txt #效果同上命令
⑻、直接操作文件
[root@localhost ~]# vim local_only_ftp.sh
#!/bin/bash
# 指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf " CONFIG="/etc/vsftpd/vsftpd.conf"
# 备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak 备份文件是否存在, 若不存在则使用 cp 命令进行文件备份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基于样本配置进行调整,覆盖现有文件
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
# 启动vsftpd 服务,并设为开机后自动运行
systemctl restart vsftpd systemctl enable vsftpd
[root@localhost ~]# chmod +x local_only_ftp.sh
[root@localhost ~]# ,/ local_only_ftp.sh
四、AWK工具介绍
1、awk工作原理
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。它是专门为文本处理设计的
编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作数据可以来自标准输入也可以是
管道或文件。
工作原理:
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变
量中,对比该行是否与给定的模式相匹配,并按模式或者条件执行编辑命令,也可以从脚本中调用
编辑指令过滤输出相应内容。
sed命令于awk命令的区别:
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个""字段"然后再进行处理。
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk
命令的过程中,可以使用关系运算符作为“条件”,用于比较数字与字符串;也可以使用逻辑操作符"
&&"表示"与"、"||表示"或"、"!"表示非";还可以进行简单的数学运算,如+、一、*、/、%、^分别表
示加、减、乘、除、取余和乘方。
2、awk基本语法
两种语法格式:awk 选项 '模式或条件 {操作}' 文件1文件2 ...
或:awk -f 脚本文件 文件1 文件2 .
awk语句中模式部分决定何时对数据进行操作,若省略则后续动作时刻保持执行状态,模式可
以为条件语句、复合语句或正则表达式等。每条编辑指令也可以包含多条语句,多条语句之间要使
用分号或者空格分割的多个{ }区域。通常用选项-F定义字段分隔符,默认以空格或者制表符作为分
隔符。
awk 包含几个特殊的内建变量(可直接用)如下所示:
FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。
FILENAME:被处理的文件名。
RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅读入一条记录,以进行处理。预设值是" \n'。数据记录分隔,默认为\n,即每行为一条记录。
3、awk实际应用
①、打印文本内容
[root@kang mytext]# awk 'NR==1,NR==3{print}' xx.txt #输出第1至第3行内容
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
[root@kang mytext]# awk 'NR==1||NR==3{print}' xx.txt #输出第1、3行内容
he was short and fat.
The home of Football on BBC Sport online.
[root@kang mytext]# awk '(NR>=1)&&NR<=3{print}' xx.txt #输出第1到第3行内容
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
[root@kang mytext]# awk '(NR%2)==1{print}' xx.txt #输出所有奇数行的内容
he was short and fat.
The home of Football on BBC Sport online.
google is the best tools for search keyword.
PI=3.141592653589793238462643383249901429
Actions speak louder than words
#woooooood
I bet this place is really spooky late at night!
192.168.90.55 wood the
[root@kang mytext]# awk '(NR%2)==0{print}' xx.txt ##输出所有偶数行的内容
He was wearing a blue polo shirt with black pants.
the tongue is boneless but it breaks bones.12!
The year ahead will test our political establishment to the limit.
a wood cross!
#woood #
……
[root@kang mytext]# awk '/^The/{print}' xx.txt #输出以The开头的行
The home of Football on BBC Sport online.
The year ahead will test our political establishment to the limit.
[root@kang mytext]# awk '/online.$/{print}' xx.txt #输出以online结尾的行
[root@kang mytext]# awk -F ":" '/bash$/{print |"wc -l"}' /etc/passwd
5
[root@kang mytext]# #统计可以登陆系统用户的个数。使用管道符号调用命令统计使用bash的用户个数,即为可以登陆系统用户的个数
[root@kang mytext]# awk -F : '!($3<900)' /etc/passwd
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
…… #输出第三个字段不小于900的行,“!”为取反
②、使用条件表达式打印
[root@kang mytext]# awk -F: '{if($3>200) {print $0}}' /etc/passwd
# 输出第3个字段大于200的行
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
……
[root@kang mytext]# awk -F: '{max=($3 > $4) ? $3:$4;print max}' /etc/passwd
#如果第3个字段的值大于第4个字段的值,则把问号前表达式的值赋给max,否则就将冒号后面那个表达式的值赋给max
[root@kang mytext]# awk -F: '{max=($3 > 200) ? $3:$1;print max}' /etc/passwd
#如果第3个字段的值大于200,则把第3个字段的值赋给max,否则就将第1个字段的值赋给max
③、按字段输出文本
[root@kang mytext]# awk -F: '{print NR,$0}' /etc/passwd
#输出处理数据的行号,每处理完一条记录,NR值加1
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
……
[root@kang mytext]# awk -F ":" '$3<5 {print $1 $3}' /etc/passwd
#输出第3列小于第5列的第1列与第3列的数据
root0
bin1
daemon2
……
[root@kang mytext]# awk -F ":" '($1~"root")&&(NF==7){print $1,$3}' /etc/passwd
#输出包含7个字段,并且第一个字段中包含root的行的第1与第2个字段的内容
root 0
[root@kang mytext]# awk -F ":" 'NR==3,NR==7{print $1,$7}' /etc/passwd
#输出第3行到第7行中以冒号为分隔符的第1列与第7列的数据
daemon /sbin/nologin
……
[root@kang mytext]# awk -F ":" 'NR==3,NR==7{print "USER:"$1,"SHEL:"$7}' /etc/passwd
#输出时插入一些文本标签
USER:daemon SHEL:/sbin/nologin
USER:adm SHEL:/sbin/nologin
……
④、匹配字段输出
用~表示包含,!~表示不包含。逻辑运算 && ||。
[root@localhost ~]# awk -F: '$1~/ro/' /etc/passwd //模糊匹配,只要有ro就匹配上
[root@localhost ~]# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
[root@localhost ~]# awk -F: '$1=="root"' /etc/passwd //精确匹配一定是root
[root@localhost ~]# awk -F: '$3<10 || $3>=1000' /etc/passwd
[root@localhost ~]# awk -F: '$3>10 && $3<1000' /etc/passwd
[root@localhost ~]# awk -F: 'NR>4 && NR<10' /etc/passwd
⑤、awk高级用法
逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END
BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
END一般用来做汇总操作,仅在读取完数据记录之后执行一次。
#awk的运算:
[root@localhost ~]# awk 'BEGIN{x=10;print x}'
//如果不用引号awk就当作一个变量来输出了,所以不需要加$了
10
[root@localhost ~]# awk 'BEGIN{x=10;print x+1}'
//BEGIN在处理文件之前,所以后面不跟文件名也不影响
11
[root@localhost ~]# awk 'BEGIN{x=10;x++;print x}'
11
[root@localhost ~]# awk 'BEGIN{print x+1}'
//不指定初始值,初始值就为0,如果是字符串,则默认为空
1
[root@localhost ~]# awk 'BEGIN{print 2.5+3.5}' //小数也可以运算
6
[root@localhost ~]# awk 'BEGIN{print 2-1}'
1
[root@localhost ~]# awk 'BEGIN{print 3*4}'
12
[root@localhost ~]# awk 'BEGIN{print 2^3}' //^和**都是幂运算
8
[root@localhost ~]# awk 'BEGIN{print 1/2}'
0.5
[root@localhost ~]# awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' pass.txt
//OFS定义了输出时以什么分隔,$1$2中间要用逗号分隔,因为逗号默认被映射为OFS变量,而这个变量默认是空格
root---x
……
[root@localhost ~]# awk 'BEGIN{RS=":"}{print $0}' /etc/passwd
//RS:指定以什么为换行符,这里指定是冒号,你指定的肯定是原文里存在的字符
root
……
[root@localhost ~]# awk 'BEGIN{ORS=" "}{print $0}' /etc/passwd
//把多行合并成一行输出,输出的时候自定义以空格分隔每行,本来默认的是回车键
[root@localhost ~]# a=100
[root@localhost ~]# awk -v b="$a" 'BEGIN{print b}'
//将系统的变量a,在awk里赋值为变量b,然后调用变量b
100
[root@localhost ~]# awk 'BEGIN{print "'$a'"}' //直接调用的话需要先用双引号再用单引号
10
[root@localhost ~]# awk -vc=1 'BEGIN{print c}' //awk直接定义变量并引用
1
⑥、调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下一行。
[root@localhost ~]# df -h | awk 'BEGIN{getline}/root/{print $0}'
/dev/mapper/centos-root 50G 5.2G 45G 11% /
[root@localhost ~]# seq 10 | awk '{getline;print $0}' //显示偶数行
2
4
……
[root@localhost ~]# seq 10 | awk '{print $0;getline}' //显示奇数行
1
3
……
⑦、if语句:awk的if语句也分为单分支、双分支和多分支
单分支为if(){}
双分支为if(){}else{}
多分支为if(){}else if(){}else{}
[root@localhost ~]# awk -F: '{if($3<10){print $0}}' /etc/passwd
//第三列小于10的打印整行
[root@localhost ~]# awk -F: '{if($3<10){print $3}else{print $1}}' /etc/passwd
//第三列小于10的打印第三列,否则打印第一列
awk还支持for循环、while循环、函数、数组等
五、其他文本编辑小工具
1、cut:列截取工具
使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如
果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一
注意:cut只擅长于处理单个字符为间隔的文本。
cut命令常用选项:
-b:按字节截取
-c:按字符截取,常用于中文
-d:指定以什么为分隔符截取,默认为制表符
-f:通常和-d一起
[root@localhost ~]# cat /etc/passwd | cut -d':' -f1-3
root:x:0
bin:x:1
daemon:x:2
[root@localhost ~]# who | cut -b 3
o
[root@localhost ~]# cat /etc/passwd | cut -d':' -f 1
root
……
2、sort命令工具
sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例
如数据和字符的排序就不一样。
命令格式:sort [选项] 参数
、sort命令常用选项
-t:指定分隔符,默认使用[Tab]键或空格分隔
-k:指定排序区域,哪个区间排序
-n:按照数字进行排序,默认是以文字形式排序
-u:等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
-r:反向排序,默认是升序,-r就是降序
-o:将排序后的结果转存至指定文件
sort passwd.txt //不加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示
sort -n -t: -k3 passwd.txt //以冒号为分隔符,以数字大小对第三列排序(升序)
sort -nr -t: -k3 passwd.txt //以冒号为分隔符,以数字大小对第三列排序(降序)
sort -nr -t: -k3 passwd.txt -o passwd.bak //将输结果不在屏幕上输出而是输出到passwd.bak文件
sort -u passwd.txt //去掉文件中重复的行(重复的行可以是不连续的)
3、uniq工具
主要用于去除连续的重复行。
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连
续的重复行他不能去重。
命令格式:uniq [选项] 参数
uniq命令常用选项:
-c:对重复的行进行计数;
-d:仅显示重复行;
-u:仅显示出现一次的行
[root@localhost ~]# cat fruit //创建一个水果类型的文件,一共9行内容
apple
apple
peache
pear
banana
cherry
cherry
banana
orange
[root@localhost ~]# cat fruit | uniq -c //统计重复行的次数,不连续的重复行他不算做重复行
2 apple
1 peache
1 pear
1 banana
2 cherry
1 banana
1 orange
[root@localhost ~]# cat fruit | sort | uniq -c //结合sort使用就是我们想要的效果
2 apple
2 banana
2 cherry
1 orange
1 peache
1 pear
[root@localhost ~]# cat fruit | sort | uniq -d //结合sort使用,过滤出重复行
apple
banana
cherry
[root@localhost ~]# cat fruit | sort | uniq -u //结合sort使用,过滤出不重复的行
orange
peache
pear
[root@localhost ~]# cat fruit | sort | uniq //结合sort使用,去重
[root@localhost ~]# cat fruit | sort -u //也可以直接用sort -u。去重
4、tr工具
它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符。
用法:tr [选项]… SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
常用选项
-d 删除字符
-s 删除所有重复出现的字符,只保留第一个
[root@localhost ~]# cat fruit | tr 'a-z' 'A-Z' 将文件中小写字母全部替换为大写
[root@localhost ~]# cat fruit | tr 'apple' 'APPLE' //替换是一一对应的字母的替换
[root@localhost ~]# cat fruit | tr 'a' ' ' //把替换的字符用单引号引起来,包括特殊字符
[root@localhost ~]# cat fruit | tr 'a' '/'
[root@localhost ~]# cat fruit | tr 'ap' '/' //多个字符替换成/
[root@localhost ~]# cat fruit | tr 'apple' 'star' //a替换成s,p替换成a,le替换成r
[root@localhost ~]# cat fruit | tr "'" '/' //如果想替换单引号则需要用双引号把单引号引起来,反斜杠转义也不行
[root@localhost ~]# cat fruit | tr -d 'a' //删除所有a
[root@localhost ~]# cat fruit | tr -d 'apple' //把所有含有这5个字母的都删除
[root@localhost ~]# cat fruit | tr -d '\n' //删除换行符
[root@localhost ~]# cat fruit | tr -s 'p' //对p字符去重,只保留第一个
[root@localhost ~]# cat fruit | tr -s '\n' //遇到多个回车只保留一个回车,相当于去除空行
总结:
文本处理器(三剑客):、grep(主搜索)、sed(主处理)、awk(主编辑)
常用的文本小工具:cut、sort、uniq、tr。