Linux下Shell(一):diff命令、cut命令、sort命令、grep命令、sed命令、awk命令等

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Leslie_qlh/article/details/99755301

Linux下Shell命令(一)


Shell基本上是一个命令解释器,它接收用户命令(如 ls等),然后调用相应的应用程序。同时它又是一种程序设计语言。

1.diff命令

diff命令是用来比较两个文件或目录的不同的。

[num1,num2][a|b|c][num3,num4]
num1,num2表示在第一个文件中的行数
a表示添加——add
c表示更改——change 
d表示删除——delete
<表示第一个文件中的内容
>表示第二个文件中的内容
---是分割线
num3,num4表示在第二个文件中的行数
例:2,4c2,4表示改变第一个文件中的第二行和第四行才能匹配第二个文件中的第二行和第四行

2.diff中常用的参数

diff	-b或--ignore-space-change 	不检查空格字符的不同
diff	-B或--ignore-blank-lines	不检查空白行
diff	-c				显示全部内文,并标出不同之处
diff	-p				显示c语言的程序码文件差异所在的函数名称
diff	-q或--brief			仅显示有无差异,不显示详细的信息
diff	-r或--recursive			比较子目录中的文件
diff	-u				以合并的方式来显示文件内容的不同(生成补丁)
cd /mnt/

vim file1		编辑file1

hello
bye~
	
vim file2		编辑file2

HELLO
bye~

【1】diff

diff file1 file2		比较file1和file2的差别
1c1				表示第一个文件需要更改
< hello
> HELLO

在这里插入图片描述

【2】-q -b

vim file2		编辑file2(在“hello”后面加两个空格)

hello  			
bye~

diff file1 file2 -q 	比较file1和file2有无差别,但是不显示详细信息		
Files file1 and file2 differ
diff file1 file2 -q -b		比较file1和file2有无差别(不计空格字符),但是不显示详细信息,此时发现没有差别	

在这里插入图片描述

【3】-B

vim file2		编辑file2(在“hello”后面加一个空行)

hello

bye~

diff file1 file2 	比较file1和file2有无差别,此时显示file1比file2少一个空行
1a2
> 
diff file1 file2 -B	比较file1和file2有无差别,但不检查空白行,此时发现没有差别

在这里插入图片描述

【4】-c

diff file1 file2 -c	比较file1和file2有无差别,显示全部内文,并标出不同之处
*** file1	2019-08-16 22:42:21.905423652 -0400
--- file2	2019-08-16 22:46:43.334423652 -0400
***************				分割线
*** 1,2 ****
--- 1,3 ----
  hello
+ 					提示第二个文件比第一个文件多一个空白行
  bye~

在这里插入图片描述

【5】-r

mkdir westos 
touch westos/haohao			建立westos目录并建立haohao文件

mkdir haohao
touch haohao/westos			建立haohao目录并建立westos文件

diff -r westos haohao			比较file1和file2有无差别
Only in westos: haohao			提示只有westos中有haohao
Only in haohao: westos			提示只有haohao中有westos

在这里插入图片描述

【6】-u

diff -u file1 file2 >  file.path	比较file1和file2有无差别,并且生成补丁
cat file.path 				查看生成的补丁
--- file1	2019-08-16 22:42:21.905423652 -0400
+++ file2	2019-08-16 22:46:43.334423652 -0400
@@ -1,2 +1,3 @@
 hello
+
 bye~

在这里插入图片描述

yum install patch -y			安装打补丁的软件

patch -b file1 file.path 		给file1文件打补丁
patching file file1
diff file1 file2 -q 			比较file1和file2有无差别,但是不显示详细信息,此时发现没有差别

3.cut命令

cut命令多用于字符截取

cut -d			指定分隔符
cut -f	1,7|1-7		指定截取第一列和第七列|第一列到第七列
cut -c	1,4|1-4		指定截取第一个和第四个字符|第一个到第四个字符

测试:

【1】-d -f

cp /etc/passwd .	复制passwd到/mnt目录下

cut -d : -f 1-2 passwd 		以“:”为分隔符,截取第一列到第二列

在这里插入图片描述

【2】-c

截取本机的ip(只显示ip)

使用cut命令:

ifconfig eth0 | cut -c 14-27 | head -n 2 | tail -n 1	
172.25.254.128

在这里插入图片描述

简便方法:

ifconfig eth0 | awk '/inet\>/{print $2}'
172.25.254.128

在这里插入图片描述

4.sort命令与uniq命令

sort命令多用于字符排序,uniq命令对重复字符做相应的处理。

sort命令:
命令 功能
sort -n 纯数字排序
sort -r 倒序
sort -u 去掉重复数字
sort -o 输出到指定文件中
sort -t 指定分隔符
sort -k 指定要排序的列
uniq命令:
命令 功能
uniq -u 显示唯一的行
uniq -d 显示重复的行
uniq -c 每行显示一次并统计重复次数

测试:

【1】建立一个无序数列的文件lee

在这里插入图片描述

sort -n	lee	将文件中的数据按纯数字排序

在这里插入图片描述

sort -r lee	将文件中的数据按倒序排列,此时只会将首字符倒序排列

在这里插入图片描述

sort -nr lee	将文件中的数据按纯数字倒序排列

在这里插入图片描述

sort -nu lee	将文件中的数据按纯数字排列,并且每个数字只出现一次不重复

在这里插入图片描述

sort -nru lee	将文件中的数据按纯数字倒序排列,并且每个数字只出现一次不重复

在这里插入图片描述

sort -nr lee | uniq -u	将文件中的数据按纯数字倒序排列,但有重复的数字全部不显示

在这里插入图片描述

sort -nr lee | uniq -c	将文件中的数据按纯数字倒序排列,并统计重复的次数

在这里插入图片描述

sort -nr lee | uniq -c | sort -t " " -k 2 -r	将文件中的数据按纯数字倒序排列,并统计重复的次数,然后按重复次数从多到少排列

在这里插入图片描述

【2】将以.conf结尾的文件从大到小排列,并显示最大的五个文件的文件名

使用sort命令:
ll | cut -c 24-99 | sort -rn | head -n 5 | cut -c 21-99

在这里插入图片描述

简便方法:
ls -S | head -n 5

在这里插入图片描述

5.&&和||命令

**&&**用来执行条件成立后执行的命令
**||**用来执行条件不成立后执行的命令

测试:

【1】ping指定主机,如果可以ping通则显示xxxxx is up,否则显示xxxxx is down

ping -c1 -w1 172.25.254.50 && echo 172.25.254.50 is up || echo 172.25.254.50 is down

在这里插入图片描述

【2】编写脚本实现功能:ping指定主机,如果可以ping通则显示xxxx is up,否则显示echo xxxx is down

vim ping.sh		编写脚本

#!/bin/bash
ping -c1 -w1 $1 &> /dev/null && {
    echo $1 is up
 }||{
    echo $1 is down
}

在这里插入图片描述

sh ping.sh 172.25.254.50		执行脚本

在这里插入图片描述

注:$1是占位符,输入的信息即为$1代表的信息。

6.text命令

test命令和**[ ]**等同,test " A &quot; = = A&quot;==“ B”等同[“ A = = A”==“ B”]

[ "$A" -ge "$B" ] 			若A大于等于B,则为真

[ "$A" -gt "$B" ]			若A大于B,则为真	

[ "$A" -ne "$B" -a "$A" -gt "$B" ]	若A不等于B且A大于B,则为真

[ "$A" -ne "$B" -o "$A" -gt "$B" ]	若A不等于B或A大于B,则为真

[ -z "$A" ]					若A长度为0,则为真

[ -n "$A" ]					若A长度不为0,则为真

[ "file1" -ef "file2" ]			查看两个文件是否使用同一个节点区域

[ "file1" -nt "file2" ]			查看文件1是否比文件2建立的晚

[ -e "file" ]				若文件存在,则为真

[ -f "file" ]				若文件存在且是一个规则文件,则为真

[ -L "file" ]				若文件存在且是一个软链接,则为真

[ -S "file" ]				若文件存在且其大小大于零,则为真

[ -b "file" ]				若文件存在且是一个块设备文件,则为真

[ -d "file" ]				若文件存在且是一个目录,则为真
	
[ -c "file" ]				若文件存在且是一个字符设备文件,则为真
测试: 编写脚本实现功能:查看指定文件,如果文件存在则判断文件类型,如果不存在则报错。
vim check_file.sh 

#!/bin/bash
[ -z "$1" ] && {
                echo Plesse input filename following script!!!
                exit
}
[ -e "$1" ] && {
        [ -L "$1" ] && {
                echo "$1" is softlink file 
                        }||{
                        [ -d "$1" ] && {
                        echo "$1" is directory
                                        }||{
                                [ -f "$1" ] && {
                                echo "$1" is common file                
                                             }||{
                                        echo "$1" is another typ        
                                                }
                                           }
                           }
                }||{
         echo No such file or directory...
}


在这里插入图片描述

在这里插入图片描述

7.grep命令

grep的格式:grep 匹配条件 处理文件

例:

grep root passwd

(1)相关命令:

grep root passwd			筛选passwd中有root字符的
grep ^root passwd			筛选passwd中以root字符开头的
grep root$ passwd			筛选passwd中以root字符结尾的
grep -i root passwd			筛选passwd中有root字符的且不区分大小写
grep -E "root|ROOT" passwd	筛选有root或者ROOT字符的(-E	可以识别“|”(或者)符)
grep root passwd -v			显示除了所筛选的字符
grep root passwd -2			所筛选字符的上下两行也显示
grep "w....s" file		
grep "w...." file
grep "....s" file

测试:

vim passwd

rootwetos
ROOTwesos
ROOTWESTOS
westosroot
wetsosROot

在这里插入图片描述

grep "root" passwd    		筛选passwd中有root字符的	

grep "root" passwd -i		筛选passwd中有root字符的且不区分大小写

grep "root" passwd -in		筛选passwd中有root字符的且不区分大小写,显示行号

在这里插入图片描述

grep -in "^root" passwd		筛选passwd中以root字符开头且不分大小写的并显示行号

grep -in "root$" passwd		筛选passwd中以root字符结尾且不分大小写的并显示行号

grep -Ein "^root|root$" passwd 		筛选passwd中以root字符开头或结尾且不分大小写的并显示行号

grep ROOT passwd  -2		筛选passwd中有root字符,并且的上下两行也显示

在这里插入图片描述

grep中字符的匹配次数设定

*				字符出现[0-任意次]
\?  			字符出现[0-1次]
\+				字符出现[1-任意次]
\{n\}			字符出现[n次]
|{m,n\}			字符出现[至少m次,最多出现n次]
\{0,n\}			字符出现[0-n次]
\{m,\}			字符出现[至少m次]
\(xy\)\{n}xy	关键字出现[n次]
.*				关键字之间匹配任意字符

(2)grep中字符的匹配位置设定

^关键字
关键字&
\<关键字
关键字\>
\<关键字\>

8.sed行编辑器

sed,即stream editor,是用来操作ASC||码的文本。处理时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)可以指定仅仅处理哪些行。sed符合模式条件的处理,不符合条件的不予处理,处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。

(1)sed对字符的处理

p		显示
d		删除
a		添加
c		替换
w		写入
i		插入

(2)p模式操作

sed -n '/\:/p' fstab			显示含有":"的行
sed -n '/UUID$/p' fstab			显示以UUID结尾的行
sed -n '/^UUID/p' fstab			显示以UUID开头的行
sed -n '2,6p' fstab				显示第二行到第六行
sed -n '2,6!p' fstab			显示除过第二到六行的信息

在这里插入图片描述

(3)d命令

sed '/^UUID/d' fstab 		除了以“UUID”开头的都显示

sed '/^#/d' fstab 		除了以“#”开头的都显示

在这里插入图片描述

sed '/4$/d' fstab 		除了以“4”结尾的都显示

sed '1,4d' fstab		除了1至4行都显示

在这里插入图片描述

sed '/^$/d' fstab 		不显示空行

sed '1d;4d' fstab		除了第1行和第4行都显示

在这里插入图片描述

sed '/^UUID/!d' fstab		除了不是以“UUID”开头的都显示(显示以UUID开头的)	

在这里插入图片描述

(4)sed行编辑器的其他命令

sed '/^UUID/a\hello sed'  fstab		在以“UUID”开头的行的后面一行添加"hello sed"

在这里插入图片描述

sed '/^UUID/a\hello sed\nwestos'  fstab 	在以“UUID”开头的行的后面一行添加"hello sed",然后在下一行添加"westos"

在这里插入图片描述

sed '/^UUID/i\hello' fstab		在以“UUID”开头的行的前面一行添加"hello"

在这里插入图片描述

sed '/^UUID/i\hello sed\nwestos'  fstab 	在以“UUID”开头的行的前面一行添加"hello sed",然后再添加一行"westos"

在这里插入图片描述

sed '/^UUID/w hahaha' fstab 			将fstab以“UUID”开头的行添加到文件hahaha中

在这里插入图片描述

sed -n '/^UUID/w haha' fstab 			将fstab以“UUID”开头的行添加到文件hahaha中,并且不显示


在这里插入图片描述

sed '6r /mnt/lee' fstab 			将fstab中除过前6行的都添加到文件lee中

在这里插入图片描述

sed '/^UUID/c\hello sed\nwestos'  fstab 	将fstab以“UUID”开头的行替换为"hello sed",并且在下一行添加"westos"

在这里插入图片描述

sed '/^UUID/=' fstab				在以“UUID”开头的行前面一行添加行号
或者
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab 	显示以“UUID”开头的行并在后面面一行添加行号

在这里插入图片描述

sed -e 's/sbin/lee/g;s/nologin/#####/' passwd 	将passwd中的"sbin"替换为"lee",并且把"nologin"替换为"#####"

在这里插入图片描述

sed 's/^#/%/' fstab				将fstab中以“#”开头的“#”替换为“%”
或者
sed 's@^#@%@g' fstab 				将fstab中以“#”开头的“#”替换为“%”

在这里插入图片描述

sed 's/\//####/g' fstab 				将fstab中“/”替换为####

在这里插入图片描述

9.awk命令

awk '{print FILENAME}' passwd 			文件passwd中信息全部显示为文件名

在这里插入图片描述

awk '{print NR}' passwd 			显示文件passwd中的行号,但不显示内容

在这里插入图片描述

awk -F : '{print NF}' passwd 			显示文件passwd中的以":"为分隔符的每行的列数

在这里插入图片描述

awk 'BEGIN{n=0}/bash$/{n++}END{print n}' /etc/passwd	显示文件passwd中的以bash结尾的信息个数

在这里插入图片描述

awk -F : 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd	显示文件passwd中的第一列并且在第一行显示"NAME"在第最后一行显示"END"

在这里插入图片描述

awk '/bash$/{print}' /etc/passwd 		显示文件passwd中的以"bash"结尾的信息

在这里插入图片描述

awk -F : '$6~/\<bin/{print}' passwd		显示文件passwd中的第六列是以“bin”开头的信息


在这里插入图片描述

awk -F : '$6!~/\<bin/{print}' passwd		显示文件passwd中的除过第六列是以“bin”开头的信息的其他信息

在这里插入图片描述

测试:

显示主机中家目录不是home且可登陆用户个数及其信息

awk -F : 'BEGIN{n=0}/bash$/&&$6!~/^\/home/{print;n++}END{print n}' /etc/passwd

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Leslie_qlh/article/details/99755301