01. Shell-小工具

本文详细介绍了Unix/Linux系统中的grep、sort、uniq、tee、diff和tr等常用命令的用途、语法、选项以及示例,帮助用户理解和掌握这些强大的文本处理工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grep

介绍

用途

grep是行过滤工具;用于根据关键字进行行过滤。

语法

grep [选项] '关键字' 文件名

#在文件名中使用关键字检索

选项

-i:不区分大小写
-v:查找不包含指定内容的行,反向选择
-w:按单词搜索
-o:打印匹配关键字
-c:统计匹配到的次数
-n:显示行号
-r:逐层遍历目录查找
-A:显示匹配行及后面多少行
-B:显示匹配行及前面多少行
-C:显示匹配行前后多少行
-l:只列出匹配的文件名
-L:列出不匹配的文件名
-e:使用正则匹配
-E:使用扩展正则匹配
^keyWord:以关键字开头
keyWord$:以关键字结尾
^$:匹配空行
--color=auto:将找到的关键词部分加上颜色并显示

帮助

man grep

举例

过滤出文件中关键字,并颜色显示关键字

  • 普通查找
grep --color=auto 'root' /tmp/passwd
  • 别名的设置
#临时设置(只针对当前用户)
alias grep='grep --color=auto'

#永久设置(针对所有用户)
echo "alias grep='grep --color=auto'" >> /etc/bashrc
source /etc/bashrc

过滤出文件中包含关键字的行,并显示是第几行

grep -n 'root' /tmp/passwd

#-n:number,表示行

过滤出文件中关键字,并忽略大小写匹配

grep -i 'root' /tmp/passwd
grep -i 'root' /tmp/passwd

过滤出文件中关键字,并显示以关键字开头或结尾

grep '^root' /tmp/passwd
grep 'bash$' /tmp/passwd

过滤出文件中关键字,并显示不包含有关键字的行

grep -v 'root' /tmp/passwd

过滤出文件中关键字,并显示包含关键字行的前几行、后几行或上下几行

grep -A 3 'ftp' /tmp/passwd
grep -B 3 'ftp' /tmp/passwd
grep -C 3 'ftp' /tmp/passwd

#-A:after,之后
#-B:before,之前
#-C:

过滤出文件中关键字,并显示包含以关键字为单词的行

grep -w 'word' /tmp/passwd

#-w:word,单词

过滤出文件中关键字,并只显示关键字本身

grep -o 'root' /tmp/passwd

过滤出文件中关键字,并统计关键字出现的次数

grep -c 'root' /tmp/passwd

cut

介绍

用途

cut是列截取工具;用于列的截取。

语法

cut 选项 文件名

选项

-c:以字符为单位进行分割,截取(后边跟的数字表示字符个数)
-d:自定义分隔符,默认制表符为“\t”
-f:与-d一起使用,指定截取哪个区域(后边的数字表示行号)

帮助

man cut

举例

以“:”为分隔符,截取第一列的内容

cut -d: -f1 /tmp/passwd
cut -d ":" -f1 /tmp/passwd

以“:”为分隔符,截取前3行的第一列和最后一列的内容

cut -d ":" -f1,7 /tmp/passwd | head -n 3
#“,”表示和,-f1,7表示第1和第7列

截取文件中的第1个到第5个字符的内容

cut -c1-5 /tmp/passwd
#“-”表示到,-c1-5表示第1到第5个字符

截取文件中的第10个字符到最后一个字符的内容

cut -c10- /tmp/passwd

sort

介绍

用途

sort工具用于排序;它将文件的每一行作为一个单位,从首字符向后,一次按ASCII码值进行比较,最后将他们按升序输出

语法

sort 选项 文件名

选项

-u:去除重复行
-r:降序排列,默认是升序
-o:将排序结果输出到文件中,类似重定向符号
-n:以数字排序,默认是按字符排序
-t:分隔符
-k:第N列
-b:忽略前导空格
-R:随机排序,每次运行的结果均不同

帮助

man sort

举例

按照用户UID进行升序排列

sort -n -t ":" -k 3 /tmp/passwd

#-n:以数字排序
#-t:指定分隔符
#-k:指定第几列

按照用户的UID进行降序排序

sort -n -r -t ":" -k 3 /tmp/passwd

#-n:以数字排序
#-t:指定分隔符
#-k:指定第几列
#-r:降序排列

按照数字排列

sort -n /tmp/passwd

按照数字排序并且去重

sort -n -u /tmp/passwd

按照数字排列并将结果重定向到新文件

sort -n -u /tmp/passwd -o /tmp/passwd.bak

uniq

介绍

用途

uniq用于去除连续的重复

语法

uniq 选项 文件名

选项

-i:忽略大小写
-c:统计重复行次数
-d:只显示重复行

帮助

man uniq

举例

去除连续重复的行并返回去重后的结果

uniq /tmp/passwd

只显示重复的行

uniq -d /tmp/passwd

统计出重复行出现的次数

uniq -c -d /tmp/passwd

tee

介绍

用途

tee工具是从标准输入读取并写入到标准输出和文件,即双向覆盖重定向(屏幕输出|文本输入)

语法

tee 选项 文件名

选项

-a:双向追加重定向

帮助

man tee

举例

屏幕打印一份,并将打印内容覆盖输入到文件中

echo "wang ming" | tee test.txt

屏幕打印一份,并将打印内容追加输入到文件中

echo "wang ming qu" | tee -a test.txt

diff

介绍

用途

diff工具用于逐行比较文件的不同
注意:diff描述两个文件不同的方式,告诉我们第一个文件怎样改变才能和第二个文件匹配。

语法

diff 选项 文件名1 文件名2

选项

-b:不检查空格
-B:不检查空白行
-i:不检查大小写
-w:忽略所有的空格
--normal:比较结果,正常格式显示(默认就是正常格式)
-c:比较结果,上下文格式显示
-u:比较结果,合并格式显示

帮助

man diff

举例

比较两个文本文件的异同,正常显示

diff old.txt new.txt

1,3d0								#第1个文件的第1到3行删除,才能和第2个文件的第0行匹配,d表示删除
< wang ming qu *5		#小于号“<”表示左边的文件,即old.txt文件
< wang ming qu *5
< wang ming qu *5
6c3,4								#第1个文件的第6行修改,才能和第2个文件的第3到4行匹配,c表示修改
< wang ming
---									#表示分隔符
> wang ming qu
> wang ming qu
13a12,15						#第1个文件的第13行添加,才能和第2个文件的第12到15行匹配,a表示添加
> wang quan zi zhi	#大于号“>”表示右边的文件,即new.txt文件
> wang quan zi zhi
> wang quan zi zhi
> wang quan zi zhi

比较两个文本文件的异同,上下文显示

diff -c old.txt new.txt

*** old.txt	2023-10-26 01:32:09.085672356 +0800		#定义***代表文件old.txt
--- new.txt	2023-10-26 01:42:15.243662950 +0800   #定义---代表文件new.txt
***************						#表示分隔符
*** 1,9 ****							#第1个文件的第1到9行
- wang ming qu *5					#需要删除后才能与第2个文件匹配,-表示删除
- wang ming qu *5
- wang ming qu *5
  wang ming qu
  wang ming qu
! wang ming								#需要修改才能与第2个文件匹配,!表示修改
  wang ming
  wang ming
  wang ming
--- 1,7 ----							#第2个文件的第1到7行
  wang ming qu
  wang ming qu
! wang ming qu						#第1个文件需要修改成“wang ming qu”样子才能与第2个文件匹配,!表示修改
! wang ming qu
  wang ming
  wang ming
  wang ming
***************
*** 11,13 ****
--- 9,15 ----
  wang
  wang
  wang
+ wang quan zi zhi				#第1个文件需要添加成“wang quan zi zhi”样子才能与第2个文件匹配,+表示添加
+ wang quan zi zhi
+ wang quan zi zhi
+ wang quan zi zhi

比较两个文本文件的异同,合并显示

diff -u old.txt new.txt

--- old.txt	2023-10-26 01:32:09.085672356 +0800		#定义---表示old.txt文件
+++ new.txt	2023-10-26 01:42:15.243662950 +0800   #定义+++表示new.txt文件
@@ -1,9 +1,7 @@			#“-1,9”表示第1个文件得第1到9行,“+1,7”表示第2个文件的第1到7行
-wang ming qu *5		#第1个文件删除后才能匹配第2个文件,-表示删除
-wang ming qu *5
-wang ming qu *5
 wang ming qu
 wang ming qu
-wang ming
+wang ming qu				#第1个文件添加后才能匹配第2个文件,+表示添加
+wang ming qu
 wang ming
 wang ming
 wang ming
@@ -11,3 +9,7 @@
 wang
 wang
 wang
+wang quan zi zhi
+wang quan zi zhi
+wang quan zi zhi
+wang quan zi zhi

对比两个目录的不同

#默认情况下也会比较两个目录里相同文件的内容
diff /tmp/ /etc

#如果只需要比较两个目录里文件的不同,不需要进一步比较文静内容,需要添加参数-q
diff -q /tmp/ /etc

其他技巧

有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方比较多时,我们可以通过打补丁的方式完成。

  1. 先找出文件的不同,然后输出到另一个文件
diff -uN old.txt new.txt > change.txt

-u:合并模式显示
-N:将不存在的文件当作空文件
  1. 将不同内容打补丁到文件
patch old.txt change.txt
  1. 测试验证
diff old.txt new.txt

paste

介绍

用途

paste工具用于合并文件行

语法

paste 选项 文件名1 文件名2

选项

-d:自定义间隔符,默认是tab
-s:串行处理,

帮助

man paste

举例

以:分割合并两个文件

paste -d ":" old.txt new.txt

串行合并两个文件

paste -s old.txt new.txt

#显示内容:第一行全是第一个文件;第二行全是第二文件

tr

介绍

用途

tr用于字符转换、替换和删除;主要用于删除文件中控制字符或进行字符转换。

语法

#用法1:命令的执行结果交给tr处理,其中string1用于查询,string2用于转换处理
commands | tr 'string1' 'string2'

#用法2:tr处理的内容来自文件,记住要使用“<”标准输入
tr 'string1' 'string2' < filename

#用法3:匹配string1进行相应操作,如删除操作
tr 选项 'string1' < filename

选项

-d:删除字符串1中所有输入字符。
-s:删除所有重复出现的字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

字符串

字符串含义备注
a-z或[:lower:]匹配所有小写字母
A-Z或[:upper:]匹配所有大写字母
0-9或[:digit:]匹配所有数字
[:alnum:]匹配所有字母和数字
[:alpha:]匹配所有字母
[:blank:]匹配所有水平空白
[:punct:]匹配所有标点符号
[:space:]匹配所有水平或垂直的空格
[:cntrl:]匹配所有控制字符\f Ctrl-L 走行换页
\n Ctrl-J 换行
\r Ctrl-M 回车
\t Ctrl-I tab键

帮助

man tr

举例

将文件中所有小写字母替换成大写字母

tr 'a-z' 'A-Z' < /tmp/passwd
tr '[:lower:]' '[:upper:]' < /tmp/passwd

将文件中所有数字替换成特殊符号

tr '0-9' '@' < /tmp/passwd
tr '[:digit:]' '@' < /tmp/passwd

将文件中所有“😕”替换成“#”

tr ':/' '#' < /tmp/passwd

#注意:字符替换只能一个一个的替换

删除文件中的所有小写字母

tr -d 'a-z' < /tmp/passwd

删除文件中的除了字母以外的所有字符

tr -d ':/, 0-9[:punct:]' < /tmp/passwd

小练习

思路:

  1. 拆解任务
  2. 分析命令
  3. 逐步实现目标

列出当前系统的运行级别,并只显示级别的数字

runlevel | cut -d " " -f 2
runlevel | cut -c 3

分别截取当前主机的IP、Netmask、广播地址

ifconfig ens32 | grep inet | grep -v inet6 | awk -F " " '{print $2,$4,$6}' | tr ' ' '\n'

截取当前主机的MAC地址

ifconfig ens32 | grep 'ether' | tr -s ' '| cut -d ' ' -f 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值