一、grep
1.过滤
ps -ef | grep linux
2.筛选工具
1.查询/etc/passwd文件中包含root的行
grep root passwd
2.查询包含root的行,并使关键词显色
grep --color=auto root passwd
3.查询/etc/passwd文件中包含root的行并显示行号
grep -n root passwd
4.查询/etc/passwd文件中包含root的行,显示行号,并且忽略大小写
grep -ni root passwd
5.查询以root开头的行
grep -ni ^root passwd
6.查询以root结尾的行
grep -ni root$ passwd
7.查询不宜root开头的行,(-v:表示取反)
grep -niv ^root passwd
(参数 -A:after, -B:before, -C:context,前后文)
8.查询以ftp开头的行及其后三行
grep -nA 3 ftp passwd
9.查询以ftp开头的行及其前三行
grep -nB 3 ftp passwd
10.查询以ftp开头的行及其前后三行
grep -nC 3 ftp passwd
11.显示没有空行的文件内容
grep -v ^$ filename
二、cut
cut是列截取命令
1.语法和选项
cut [选项] 文件名
-c:以字符为单位进行分割,截取
-d:自定义分隔符,默认为制表符\t
-f:与-d一起使用,指定截取哪个区域
2.用例
1.截取第一列数据
cut -d: -f1 passwd
2.截取头十行第一列和第七列的数据
cut -d: -f1,7 passwd | head
3.截取每行前5个字符
cut -c1-5 passwd
4.截取每行第10个字符及以后内容
cut -c10- passwd
5.截取每行第5到第10个字符
cut -c5-10 passwd
小练习
用grep和cut列出当前系统的运行级别
1.如何查看系统运行级别
-
命令 runlevel
-
文件 /etc/inittab(ContOS7中该文件没有可修改内容)
1.截取结果的第三个字符
runlevel | cut -c3
2. 以空格分割结果,区第二列
runlevel | cut -d ' ' -f2
3.获取不已#开头的数据,以冒号分割,去第二列
grep -v ^# /etc/inittab | cut -d: -f2
4.获取以id开头的数据,以冒号分割,取第二列
grep ^id /etc/inittab | cut -d: -f2
5.获取以"initdefault:"结尾的数据,取第4个字符
grep initdefault:$ /etc/inittab | cut -c4
6.获取每行第4个字符,查看最后一行
cut -c4 /etc/inittab | tail -1
三、sort
sort用于排序,它将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将它们按升序输出
1.语法和选项
-u:去除重复行
-r:降序排列,默认是升序
-o:将排序结果输出到文件中,类似重定向符号">"
-n:以数字排序,默认是按字符排序
-t:分隔符
-k:第N列
-b:忽略前导空格
-R:随机排序,每次运行的结果均不同
1.数字排列以冒号分割的第三列数据
sort -n -t: -k3 passwd
2.数字排列以冒号分割的第三列数据,降序输出
sort -nr -t: -k3 passwd
3.数字排列以冒号分割的第三列数据,降序输出到1.txt文件中
sort -nr -t: -k3 passwd -o 1.txt
4.去重文件1.txt
sort -u 1.txt
四、uniq
uniq用于去除连续的重复行
1.常用选项
-i:忽略大小写
-c:统计重复行次数
-d:只显示重复行
tee是从标准输入读取并写入到标准输出和文件,即:双向覆盖重定向(屏幕输出|文本输入)
1.选项
-a:双向追加重定向
1.屏幕打印hello并输入到1.txt文件
echo hello | tee 1.txt
2.屏幕打印hello word并覆盖到1.txt文件
echo hello world | tee 1.txt
3.屏幕打印HELLO并追加到1.txt文件
echo HELLO | tee -a 1.txt
六、diff
diff工具用于逐行比较文件的不同
注意:diff描述两个文件不同的方式是,怎样改变第一个文件之后与第二个文件匹配
1.语法和选项
diff [选项] 文件1 文件2
-b 不检查空格
-B 不检查空白行
-i 不检查大小写
-W 忽略所有的空格
--normal 正常格式显示(默认)
-c 上下文格式显示
-u 合并格式显示
2.用例
1.准备文件
[root@shell test]# cat file1
aaaa
111
hello world
222
333
bbb
[root@shell test]#
[root@shell test]# cat file2
aaa
hello
111
222
bbb
333
world
[root@shell test]# diff file1 file2
1c1,2 第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到第2行匹配
< aaaa 小于号"<"表示左边文件(file1)文件内容
--- ---表示分隔符
> aaa 大于号">"表示右边文件(file2)文件内容
> hello
3d3 第一个文件第3行删除(d=delete)后才能和第二个文件的第3行匹配
< hello world
5d4 第一个文件第5行删除(d=delete)后才能和第二个文件的第4行匹配
< 333
6a6,7 第一个文件第6行增加(a=add)内容后才能和第二个文件的第6到第7行匹配
> 333 需要增加的内容在第二个文件里是333和world
> world
[root@shell test]# diff -c file1 file2
前两行比较文件名和时间戳,***表示file1,---表示file2
*** file1 2022-02-23 14:54:24.365107949 +0800
--- file2 2022-02-23 14:54:57.625110667 +0800
*************** 表示分隔符
*** 1,6 **** file1的1到6行
! aaaa !表示该行需要修改才与第二个文件匹配
111
- hello world -表示该行需要删除才与第二个文件匹配
222
- 333 -表示该行需要删除才与第二个文件匹配
bbb
--- 1,7 ----
! aaa 表示第一个文件需要修改才与第二个文件匹配
! hello 表示第一个文件需要修改才与第二个文件匹配
111
222
bbb
+ 333 表示第一个文件需要增加该行才与第二个文件匹配
+ world 表示第一个文件需要增加该行才与第二个文件匹配
[root@shell test]# diff -u file1 file2
--- file1 2022-02-23 14:54:24.365107949 +0800
+++ file2 2022-02-23 14:54:57.625110667 +0800
@@ -1,6 +1,7 @@
-aaaa file1删除该行
+aaa file1增加该行
+hello file1增加该行
111
-hello world file1删除该行
222
-333 file1删除该行
bbb
+333 file1增加该行
+world file1增加该行
1.先找出文件的不同,然后输出到一个文件
diff -u file1 file2 > file.patch
2.将不同内容打补丁到文件
patch file1 file.patch
3.测试验证
diff file1 file2
七、paste
用于合并文件行,不更改原文件
1.常用选项
-d:自定义间隔符,默认是tab
-s:串行处理,非并行
[root@shell test]# cat -n file1
1 hello world
2 8888
[root@shell test]# cat -n file2
1 heima itcast
2 999
3 oooo
1.无选项
[root@shell test]# paste file1 file2
hello world heima itcast
8888 999
oooo
2.-d
[root@shell test]# paste -d: file1 file2
hello world:heima itcast
8888:999
:oooo
3.-s
[root@shell test]# paste -s file1 file2
hello world 8888
heima itcast 999 oooo
tr用于字符转换、替换和删除,主要用于删除文件中控制字符或进行字符转换
注意:文件内容不发生改变
1.语法选项
语法:
用法1:命令执行结果交予tr处理,str1用于查询,str2用于转换处理
commands | tr 'str1' 'str2'
用法2:tr处理的内容来自文件,需要使用"<"标准输入
tr 'str1' 'str2' < filename
用法3:匹配str1进行删除操作
tr options 'str1' < filename
选项:
-d:删除str1中所有输入字符
-s:删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串
1.将1.txt文件中的小写字母换成大写字母
tr a-z A-Z < 1.txt
2.将1.txt文件中所有数字替换成@符号
tr 0-9 @ < 1.txt
3.将1.txt文件中的":"和"/"替换成"#"
tr ':/' '#' < 1.txt
4.去除文件中的小写字母
tr -d a-z < 1.txt