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
其他技巧
有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方比较多时,我们可以通过打补丁的方式完成。
- 先找出文件的不同,然后输出到另一个文件
diff -uN old.txt new.txt > change.txt
-u:合并模式显示
-N:将不存在的文件当作空文件
- 将不同内容打补丁到文件
patch old.txt change.txt
- 测试验证
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
小练习
思路:
- 拆解任务
- 分析命令
- 逐步实现目标
列出当前系统的运行级别,并只显示级别的数字
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