shell学习笔记---常用的文本处理命令

grep命令
格式:grep 参数 匹配的表达式 文件。在文件中找出符合匹配表达式的内容

grep "line" test.txt

常用参数:

参数含义
-c只打印匹配的行数,不打印匹配的内容
-i忽略字母大小写
-l列出含有匹配表达式的文件名,不显示具体内容
-n列出所有含有匹配表达式的行,并显示行号
-r递归搜索
-v显示不包含匹配表达式的行内容
-E支持正则表达式
-P支持Perl正则表达式

关于shell中的正则表达式语法和Python中类似,可参考python正则表达式学习记录

echo命令
格式:echo 参数 内容 。在控制台输出内容,并自动换行。添加-n参数可以输出后不换行。

echo "Hello World"

输出命令执行结果:

echo `ls -lth`

可以通过>将结果重定向到文件中:关于>的使用可以参考shell学习笔记—基础语法

echo `ls -lth` > all.txt

支持转义字符:但需要-e参数

echo -e "hello\tworld"
转义字符含义
\b退格符
\c后续文本不输出
\f换页符
\n换行符
\r回车符
\t水平制表符
\r垂直制表符

fold命令
格式:fold 参数 文件。将文件内容按照指定宽度输出,超出部分转到下一行输出。

fold -w 20 test.txt
参数含义
-b按字节计算宽度,默认是字符
-s对单词不进行折断,在空格处折断
-w指定宽度,默认是80列

wc命令
格式:wc 参数 文件。对文件内容进行统计。不加任何参数如下面命令,默认输出三个结果,依次是行数,单词书数,字符数。

wc test.txt
参数含义
-c统计字节数
-m统计字符数
-l统计行数
-L统计最长行的长度
-w统计单词数

fmt命令
格式:fmt 参数 文件。将文件段落按格式输出。

fmt -w 30 test.txt
参数含义
-c保留每个段落的首行缩进
-s只折断超过指定宽度的行,不合并短的行
-w指定每行最大宽度,默认75列

rev反转字符输出
格式:rev 文件。将文件倒序输出。

rev test.txt

pr命令
格式:pr 参数 文件。将文件转换成适合打印的格式输出。

pr -a -4 test.txt

test.txt内容:
在这里插入图片描述
用上面命令打印后:
在这里插入图片描述

参数含义
-n指定输出的一行有n列,n换成阿拉伯数字
-a水平创建一行,不加-a默认是垂直创建一行
-h指定页眉,默认是文件名
-l每页的行数,默认66行
-w指定页面的宽度,默认72个字符
-t不显示标题

sort命令
格式:sort 参数 文件
文件原本内容:
在这里插入图片描述
用下面命令排序并打印:

sort test.txt  

结果:不加任何参数默认将整行进行比较,从第一个字符依次开始比较,从小到大排序。
在这里插入图片描述

参数含义
-c测试文件是否已经排序
-f忽略大小写,将小写字母转换大写字母后比较
-n根据算数值比较
-R根据哈希值随机排序
-r颠倒排序结果,默认是从小到大
-k定义排序比较的关键列
-m合并已经排序好的文件,不进行重新排序
-t指定列分割符,默认是空格,一行最多包括10列
-u删除重复的行,保留第一个
-b忽略列前面的空格,用第一个非空格字符开始比较

-k 列1,列2 ------ 指定比较的关键列。优先比较列1,在列1相同的情况再比较列2。如果想只通过一个列进行比较需要写成*-k 列1,列1*。而并非*-k 列1*,这种写法代表着从列1开始到结束,省略了结束列而已。

sort -b -k 2,3 test.txt  

结果:
在这里插入图片描述

-k 列1.位置1,列2.位置2-------比较的关键部分从列1的位置1开始到列2的位置2结束。用来将比较部分限定到某列的一部分,而不是全部。

sort -b -k 2.2,2.2 test.txt

结果:
在这里插入图片描述

-r --------根据关键字降序排列,默认是从小到大排序

sort -b -r -k 2,3 test.txt

结果:
在这里插入图片描述
-n-------将关键字看做数值进行排序。默认是看做字符串,按照字符串顺序进行排序。

sort -b -n -k 3,3 test.txt

结果:在这里插入图片描述
下图是另一种写法,将参数放到指定的比较位置的后面,放到那个列后面代表在哪个列生效,放在前面则是全部生效。

sort -b  -k 3,3nr test.txt

在这里插入图片描述
-k 列1,列2 -k 列3,列4----------可以通过多个-k参数指定多个比较列。在第一个指定的比较列相同时,第二个指定的比较列才生效。下面的例子是先比较第二列,在第二列相同时,再通过第三列按数值从大到小排序。

sort -b -k 2,2 -k 3,3nr test.txt

结果:
在这里插入图片描述

-t 分隔符-------通过该参数自定义列的分隔符。默认是连续的空格或制表符为分割符。下面命令就是讲冒号设定为列分隔符,并讲第三列作为比较列,进行数值比较排序。

sort -t : -k 3n,3 /etc/passwd

-u-------对于重复的行进行去重,保留第一行。

sort -b -u -k 2,2 test.txt

结果:在这里插入图片描述
sort 文件1 文件2-----可以通过这种方式将两个文件合并在一起,并整体进行排序;如果只想单纯的合并不想排序,可以加个-m参数。

sort test.txt test1.txt

cut命令
格式:cut 参数 文件。可以从文本文件中选取某些文本列。

参数含义
-c选择指定的字符
-b选择指定的字节
-d自定义列的分隔符,默认是制表符
-f选择指定的列
-s不输出不包含分隔符的行

-f 列1,列2,列3-列4------用该参数选取指定的列,多个列用逗号隔开,可以通过-表示连续的列。打印出来的列与列之前还是用分隔符隔开。
-d 分隔符------用该参数自定义列的分隔符,默认是制表符。用分隔符分好列后便可以通过-f参数获取想要获取的部分列。
下面命令是通过冒号将/etc/passwd文件每行进行分列,然后获取第一列,第二列,第五到七列。

cut -d ":" -f 1,3,5-7 /etc/passwd

-c 字符1,字符2,字符3-字符4-----用该参数选取指定的字符,多个字符用逗号隔开,可以通过-表示连续的列。
下面命令是获取每行的第一个字符,第二个字符,第五到第七个字符,由于是获取单个字符,无需进行分列。

cut -c 1,3,5-7 /etc/passwd

-s-------用该参数排除掉不含分隔符的行。不用该参数默认会打印出没有分隔符的行所有内容。只要行中有一个列分隔符,都会被含有该参数的cut命令输出。

cut  -s -d ":" -f 1,3,5-7 test.txt

paste命令
格式:paste 参数 文件1 文件2 … 。将多个个文件的行并行的连接在一起,并输出。

paste test1.txt test2.txt

结果:左一列是test1.txt内容,右一列是test2.txt内容
在这里插入图片描述

参数含义
-d指定拼接的两个文件中对应行之间的分隔符,默认是制表符
-s将一个文件中的多行数据合并为一行进行显示,在将后一个文件追加到前一个文件的下面一行
paste -d ":" test1.txt test2.txt

在这里插入图片描述

paste -s  test1.txt test2.txt

在这里插入图片描述
如果想要分别从两个文件中各选取几列,拼接在一起。可以先用cut命令分别获取到对应列并重定向新文件,然后拼接;或者先拼接,再用paste命令拼接。

join命令
格式:join 参数 文件1 文件2。将文件1和文件2的文本行基于关键字进行拼接。就像关系型数据库中的多表级联查询。注意只能拼接两个文件。

join test1.txt test2.txt

test1.txt:在这里插入图片描述
test2.txt:
在这里插入图片描述
上面命令的运行结果如下图:可以看出,连个文件分别以第一列为关键字,相等的便拼接在了一起,并且关键列只输出了一次。test1文件中的第七行和test2中的第七行由于关键字不一致便被舍弃。
在这里插入图片描述

参数含义
-1 列号将第一个文件的指定列设为比较的关键列
-2 列号将第二个文件的指定列设为比较的关键列
-a 文件号输出指定文件的不匹配的行,文件号可取1或2分别代表两个文件。默认不输出未匹配到的行
-e 字符串使用字符串代替空列(找不到的列)
-i在进行比较关键列时,忽略大小写
-t自定义列分隔符
-o自定义输出列

-1 列号 -2 列号------指定比较的关键列。默认是将两个文件第一列作为关键列
test2.txt改为如图:在这里插入图片描述

join -1 1 -2 2 test1.txt test2.txt

结果:将第一个文件的第一列和第二个文件的第二列设为比较的关键列,两列比较如果相同便进行拼接。依然省略第二个文件的关键列,关键列只打印了一次
在这里插入图片描述
-a 文件号-----将指定的文件的不匹配的行也进行输出。文件号可选1或2 分别代表第一个和第二个文件;如果想同时指定两个文件可以写为-a 1 -a 2。

join -1 1 -2 2 -a 1 test1.txt test2.txt

结果:命令通过-a 1将第一文件即test1中的不匹配的行也进行了输出,类似数据库中的左外连接在这里插入图片描述

join -1 1 -2 2 -a 2 test1.txt test2.txt

结果:命令通过-a 2将第二个文件即test2中的不匹配的行也进行了输出,类似数据库中的又外连接
在这里插入图片描述

join -1 1 -2 2 -a 1 -a 2 test1.txt test2.txt

结果:命令通过-a 1 -a 2将两个文件中不匹配的行也进行了输出,类似数据库中的全外连接。如果不加-a参数,两个文件中的不匹配的行便不会输出,类似数据中的内连接
在这里插入图片描述
-o 文件号.列号 文件号.列号 … ----通过-o指定输出某个文件中的某列。不加该参数默认是全输出

join -1 1 -2 2 -o 1.1 2.1 2.3 test1.txt test2.txt#如果这个写法报错就使用下行的写法
join -1 1 -2 2 -o 1.1 -o 2.1 -o 2.3 test1.txt test2.txt

结果:通过-o指定输出第一个文件的第一列,第二个文件第一列和第三列。除了指定的列其他列并且有输出(我在mac本上试第一行命令报错,第二行命令可以执行,如果报错分别用两种写法试试)在这里插入图片描述
-e 字符串----如果在文件中找不到指定的列,用指定的字符串代替该列。

join -1 1 -2 2 -o 1.1 -o 2.1 -o 2.3 -o 2.4 -e '!!!' test1.txt test2.txt

结果:上面命令指定输出了test2文件的第四列,但是因为不存在第四列,便输出了指定的字符串
在这里插入图片描述
-t 字符串----如果文件1和文件2中的列分隔符不是默认的制表符,可以通过该参数指定分隔符。
将test1文件改为:
在这里插入图片描述
将test2文件改为:
在这里插入图片描述

join -1 1 -2 2 -t ":" test1.txt test2.txt

结果:两个文件的分隔符改了冒号,通过-t指定冒号为列分隔符,可以看到输出的结果列分隔符也是冒号。
在这里插入图片描述
tr命令
格式:tr 参数 字符集1 字符集2 -----用字符集2替换文本中的字符集1。

tr "[a-z]" "[A-Z]" < test1.txt

上面的命令是将test1.txt文件中的小写字母替换为大写字母。注意tr命令不能直接操作文件,所以通过重定向的方式给tr命令文本内容。而修改后的内容只是输出,并不会修改源文件内容

参数含义
-c用字符集2替换文本中 没有在字符集1中的字符
-d删除文本中在字符集1中的所有字符
-s压缩文本中字符集1中的字符,即连续几个相同的字符只保留一个
tr  "one" "ONE" <test1.txt 

结果:上面命令是将test1.txt文件中小写的o替换成大写的O,小写的n替换成大写的N,小写的e替换成大写的E。注意:替换的是字符级别,而不是完整的one字符串替换成ONE字符串。

-s 字符集1 ----- 将文本中的在字符集1的字符,连续出现的几个压缩成一个。

cat test3.txt | tr -s "[a-z][0-9]"

源文件:
在这里插入图片描述

结果:将test3中的连续出现的小写字母和数字压缩成一个。
在这里插入图片描述

cat test4.txt | tr -s "[\n]"

上面的命令将连续回车压缩成一个回车,即删除空行。
-d 字符集1 ------将文本中在字符集1中的字符删除掉。

tr -d "[a-z][:]" < test1.txt

结果:将小写字母以及冒号都删掉了,就剩数字了。
在这里插入图片描述
-c 字符集1 字符集2-----将文本中,不在字符集1中的字符,替换成字符集2。

tr -cs "[0-9]" "\n" < test1.txt

上面命令是将非数字都替换成回车,然后降连续的回车压缩成一个回车,结果和上图一样。

-------------------------------学习自“shell从入门到精通”--------------------------------------------

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值