Linux中常用的文本处理命令(echo、sort、uniq、tr、cut、split、eval)

749 阅读9分钟

1、echo命令——输出

echo 命令主要用来显示字符串信息。

语法格式:

 echo 【选项] 字符串

常用选项:

 echo -n   表示不换行输出
 echo -e   表示输出转义符(字符串必须加引号,转义符才生效)

常用的转义符(转义符需结合-e同时使用,且字符串必须加引号):

选项作用
\n插入换行符,输出换行
\r光标移至行首,并且不换行
\s当前shell的名称,如bash
\t插入Tab键(即制表符)
\f换行,但光标仍停留在原处
\ \表示插入\本身
\b插入退格键,表示退格,不显示前一个字符
\c抑制更多的输出或不换行

关于换行符的小贴士:

 echo -n
 echo -e  "XXXXXX\c"
 #除了以上两种方式输出的内容结尾不会携带换行符,echo其它输出方法都会默认携带一个换行符\n

示例:

 [root@yuji ~]# echo "helloworld"
 helloworld
 [root@yuji ~]# echo -e "hello\nworld"      //插入换行符,即输出换行
 hello
 world
 [root@yuji ~]# echo -e "hello\tworld"       //插入制表符
 hello   world
 [root@yuji ~]# echo -e "hello\bworld"       //退格一次
 hellworld
 [root@yuji ~]# echo -e "hello\b\bworld"     //退格两次
 helworld 
 [root@yuji ~]# echo -e "hello\world"        //插入\本身
 hello\world
 ​
 [root@yuji ~]# echo -n "helloworld"      //内容结尾不会携带换行符
 helloworld[root@yuji ~]#
 [root@yuji ~]# echo -e "helloworld\c"    //内容结尾不会携带换行符
 helloworld[root@yuji ~]#

1echo.png

1echo2.png

2、sort命令——排序

sort将文件的每一行作为一个单位相互比较,比较原则是从首字符向后依次按ASCII码进行比较,最后将它们按升序输出。(以行为单位来排序输出)

语法格式:

 sort [选项]  参数
 ​
 cat file | sort 选项

常用选项:

常用选项作用
-n按照数字进行排序(默认升序)
-r反向排序(倒序)
-u等同于uniq,表示相同的数据仅显示一行
-t指定字段分隔符,默认使用Tab键分隔
-k指定排序字段(不指定则默认第一个字段)
-f忽略大小写,会将小写字母都转换为大写字母来进行比较
-b忽略每行前面的空格
-o <输出文件>将排序后的结果转存到指定文件中

示例:

先准备一个文件,每行随意填写数字。

 [root@yuji ~]# cat 1.txt
 1
 3
 100
 2
 19
 19
 400
 200
 78
 3333
 78

2sort1.png

1)不加任何选项,则默认按首字母排序。

 [root@yuji ~]# sort 1.txt
 1
 100
 19
 19
 2
 200
 3
 3333
 400
 78
 78

2sort2.png

2)-n,按照数字排序(默认升序)。

 [root@yuji ~]# sort -n 1.txt
 1
 2
 3
 19
 19
 78
 78
 100
 200
 400
 3333

2sort3.png

3)-r,倒序。默认是升序排列,加-r后是降序排列。

 [root@yuji ~]# sort -n -r 1.txt   //按数字降序排列
 3333
 400
 200
 100
 78
 78
 19
 19
 3
 2
 1

2sort4.png

4)-u,合并重复行,相同数据只显示一行。

 [root@yuji ~]# sort -nru 1.txt
 3333
 400
 200
 100
 78
 19
 3
 2
 1

2sort5.png

5)-t,指定分隔符。-k,指定对第几个字段进行排序。

 [root@yuji ~]# sort -t ":" -k 3 -n /etc/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
 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
 games:x:12:100:games:/usr/games:/sbin/nologin
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 ......

2sort6.png

6)-o <输出文件>,将排序后的结果转存到指定文件中。

查看/data目录下所有子目录和文件占磁盘空间的大小(即查看目录的磁盘使用情况),按从大到小排序,之后将结果存入/du.txt文件中。

 [root@yuji data]# du -a | sort -nr    //查看所有子目录和子文件占磁盘空间的大小
 32      .
 4       ./up_ip
 4       ./test/passwd
 4       ./test
 4       ./maopao1.sh
 4       ./ips.txt
 4       ./host_ip
 4       ./hostip
 4       ./hello.sh
 4       ./down_ip
 0       ./test/f1.txt
 [root@yuji data]# du -a | sort -nr -o /du.txt    //将排序后的结果存入/du.txt文件中
 [root@yuji data]# cat /du.txt
 32      .
 4       ./up_ip
 4       ./test/passwd
 4       ./test
 4       ./maopao1.sh
 4       ./ips.txt
 4       ./host_ip
 4       ./hostip
 4       ./hello.sh
 4       ./down_ip
 0       ./test/f1.txt

2sort7.png

3、uniq命令——去重

uniq命令用于报告或者忽略文件中连续的重复行,常与sort命令结合使用。

语法格式:

 uniq [选项] 参数
 ​
 cat file | uniq 选项

常用选项:

常用选项作用
-c统计连续重复的行的次数,并且合并重复的行
-u显示仅出现一次的行(包括不连续的重复行)
-d仅显示重复出现的行(必须是连续的重复行)

示例:

1)uniq不加选项,只会对连续的重复行进行去重。

 [root@yuji ~]# cat 2.txt
 1
 2
 33
 33
 33
 444
 444
 1
 33
 2
 444
 [root@yuji ~]# uniq 2.txt
 1
 2
 33
 444
 1
 33
 2
 444

3uniq1.png

2)uniq -c,显示连续重复行出现的次数,并合并重复行。

 [root@yuji ~]# uniq -c 2.txt
       1 1
       1 2
       3 33
       2 444
       1 1
       1 33
       1 2
       1 444

3uniq2.png

3)uniq -c,与sort命令结合,统计相同行重复出现的次数,包括不连续的重复行。

 [root@yuji ~]# sort -n 2.txt |uniq -c
       2 1
       2 2
       4 33
       3 444

3uniq3.png

4)uniq -u,显示仅出现过一次的行(但包括不连续的重复行)。

 [root@yuji ~]# cat 3.txt
 1
 2
 5
 6
 33
 33
 33
 444
 444
 1
 33
 2
 444
 [root@yuji ~]# uniq -u 3.txt
 1
 2
 5
 6
 1
 33
 2
 444

3uniq4.png

5)uniq -u,与sort命令结合,显示真正仅出现过一次的行。

sort -n 将原文档中不连续的重复行,连续排列在了一起,使uniq -u 可以显示真正仅出现过一次的行。

 [root@yuji ~]# cat 3.txt| sort -n | uniq -u
 5
 6

3uniq5.png

4、tr命令——删除、替换、压缩

tr命令常用来对来自标准输入的字符进行替换、压缩和删除。

命令格式:

 cat file | tr [选项]  参数

常用选项:

选项作用
-c保留字符集1的字符,其他字符包括换行符\n用字符集2替换
-d删除所有属于字符集1的字符
-s将连续重复的字符串压缩成一个
-t字符集2 替换 字符集1,不加选项效果相同

常用参数

参数说明
字符集1指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”
字符集2指定要转换成的目标字符集

4.1 tr命令的一般使用

示例1:

 [root@yuji ~]# echo abc | tr 'a-z' 'A-Z'     //将所有小写字母替换为大写
 ABC
 [root@yuji ~]# echo abc | tr 'a' 'A'         //将小写a替换为大写A
 Abc
 [root@yuji ~]# echo abc | tr -t 'a' 'A'      //将小写a替换为大写A
 Abc
 [root@yuji ~]# echo "192.168.80.10" | tr '.' ' '    //将.替换为空格
 192 168 80 10

4tr1.png

示例2:

 [root@yuji ~]# echo abc| tr "abc" "123"
 123
 [root@yuji ~]# echo abc| tr "ab" "123"
 12c
 [root@yuji ~]# echo abc| tr "abc" "12"
 122

4tr2.png

示例3:

-c,保留字符集1的字符,其他字符包括换行符\n用字符集2替换。

 [root@yuji ~]# echo -e "abc\ncba\nab"
 abc
 cba
 ab
 [root@yuji ~]# echo -e "abc\ncba\nab" | tr -c "ab" "0"
 ab000ba0ab0[root@yuji ~]#
 [root@yuji ~]# echo -e "abc\ncba\nab" | tr -c "ab\n" "0"
 ab0
 0ba
 ab

4tr3.png

示例4:

-d,删除所有属于字符集1的字符。

 [root@yuji ~]# echo "hello world"
 hello world
 [root@yuji ~]# echo "hello world" | tr -d " "
 helloworld
 [root@yuji ~]# echo "hello world" | tr -d "lo"
 he wrd

4tr4.png

示例5:

-s,将连续重复的字符串压缩成一个。

 [root@yuji ~]# echo "hhhi woooorld"
 hhhi woooorld
 [root@yuji ~]# echo "hhhi woooorld" | tr -s "h"
 hi woooorld
 [root@yuji ~]# echo "hhhi woooorld" | tr -s "ho"
 hi world
 [root@yuji ~]# echo "hhhi woooorld" | tr -s "ho" "z"
 zi wzrld

4tr5.png

示例6:生成12位随机码

tr -dc "字符集1":符合字符集1的部分不做处理,其他字符进行删除。

 [root@yuji ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c12
 RvKGD5mNqOJz[root@yuji ~]#
 ​
 #/dev/urandom         //非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据
 #tr -dc '[:alnum:]'   //保留数字和英文字母,其他字符全都删除
 #head -c12            //显示前12个字符

4tr5-2.png

4.2 分行输出环境变量PATH中包含的所有目录

使用tr命令,将冒号(":")替换为换行符("\n")

 [root@yuji ~]# echo $PATH
 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
 [root@yuji ~]# echo $PATH | tr ":" "\n"
 /usr/local/sbin
 /usr/local/bin
 /usr/sbin
 /usr/bin
 /root/bin

4tr6.png

4.3 过滤出文件中的非空行

方法1、使用tr命令删除文件中的空行(即压缩换行符)

方法2、使用grep命令过滤非空行。

 [root@yuji ~]# cat 4.txt
 11
 ​
 22
 ​
 ​
 33
 [root@yuji ~]# cat 4.txt| tr -s "\n"       //将连续的换行符压缩成一个
 11
 22
 33
 [root@yuji ~]# cat 4.txt| grep -v "^$"     //过滤出非空行
 11
 22
 33

4tr7.png

5、cut命令——截取字段或字符串

用于显示行中的指定部分,删除文件中指定字段。

命令格式:

cut [选项] 参数

cat file | cut [选项] 参数

常用选项:

选项作用
-d指定分隔符(默认分隔符为Tab)
-f n按字段进行截取。指定第n个字段;1-3表示从第1个字段到第3个字段;1,4,7表示第1、第4、第7个字段
-b以字节为单位进行截取
-c以字符为单位进行截取
–complement排除所指定的字段
–output-delimiter更改输出内容的分隔符

示例:

1)-d 指定分隔符,-f 按字段进行截取。

5cut1.png

2)-f,连续的字段使用"-"连接,不连续的字段之间使用逗号。

5cut2.png

3)–complement,排除所指定的字段。

5cut3.png

4)–output-delimiter,更改输出内容的分隔符。

5cut4.png

截取字符串的常用方法:

常用的三种方法:

 1.${i:起始下标值:截取长度}      
 #i是变量,字符的下标值从0开始。例如 ${i:0:2} 
 ​
 2.echo $i | cut -c 1-3
 #-c表示按字符截取,字符下标值从1开始,起始位置-终止位置。1是起始位置,3是终止位置。
 ​
 3.expr substr $i 1 3 
 #下标值从1开始。1代表起始位置,3代表截取的字符长度。

示例:

i=123456789,要求截取3456。

 [root@yuji ~]# i=123456789
 [root@yuji ~]# echo ${i:2:4}     //从下标值为2的字符开始截取,共截取4个字符
 3456
 [root@yuji ~]# echo $i | cut -c 3-6    //截取第3到第6个字符
 3456
 [root@yuji ~]# expr substr $i 3 4    //从第3个字符开始截取,共截取4个字符
 3456

5cut5.png

5cut6.png

6、split命令——拆分文件

split命令用于在Linux下将大文件拆分为若干小文件。

语法格式:

 split 选项 参数 原始文件 拆分后文件名前缀

常用选项:

选项作用
-l指定行数
-b指定大小

示例:

以3行对文件进行拆分,最后一个文件的行数如果没有3行,则以实际行数进行分配。

 [root@yuji tt]# cat num.txt
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 [root@yuji tt]# split -l 3 num.txt num    //以3行对文件进行拆分
 [root@yuji tt]# ls
 numaa  numab  numac  numad  num.txt
 [root@yuji tt]# cat numaa
 1
 2
 3
 [root@yuji tt]# cat numab
 4
 5
 6
 [root@yuji tt]# cat numac
 7
 8
 9
 [root@yuji tt]# cat numad     //最后一个文件的行数如果没有3行,则以实际行数进行分配
 10

6split1.png

6split2.png

7、eval命令——扫描命令2次

命令字前加上eval,shell会在执行命令之前扫描它两次,eval命令首先会先扫描命令行进行所有的置换,然后再执行命令,该命令适用于那些一次扫描无法实现功能的变量,该命令会对变量进行两次扫描。

示例1:

 [root@yuji ~]# echo "hello world">file
 [root@yuji ~]# cat file
 hello world
 [root@yuji ~]# myfile="cat file"
 [root@yuji ~]# echo $myfile     //输出变量myfile的值
 cat file
 [root@yuji ~]# eval $myfile    //扫描命令2次,先将myfile置换成"cat file",之后执行"cat file"
 hello world

7 eval1.png

示例2:

 [root@yuji ~]# cat demo.sh
 #!/bin/bash
 ​
 eval echo $$#    //先将$$#置换成$5(即\$置换成$,$#置换成参数个数5),之后执行“echo $5”,即输出第5个位置参数的值
 ​
 [root@yuji ~]# bash demo.sh 1 2 3 4 5
 5

7 eval2.png

示例3:

 [root@yuji ~]# a=100
 [root@yuji ~]# b=a
 [root@yuji ~]# eval echo $$b  //先将$$b置换成$a(即\$置换成$,$b置换成a),之后执行echo $a
 100
 [root@yuji ~]# eval $b=50
 [root@yuji ~]# echo $a
 50

7 eval3.png