Linux之shell脚本学习(一)——常用命令、正则表达式

一、什么是shell?

编程语言: Shell 首先是 UNIX/Linux 下的脚本编程语言,它是解释执行的,无需提前编译。Shell 的语法细节和你熟悉的大部分编程语言都不太一样,需要重点学习。

程序 : Shell 同时也是一个程序,它的一端连接着 UNIX/Linux 内核,另一端连接着用户和其它应用程序;换句话说,Shell 是用户和应用程序与内核沟通的桥梁。

二、编写shell脚本

1、如何建立一个新的shell脚本

step1:

vim test.sh

一般情况下,脚本的结尾为“.sh“,注意这不是系统的要求,而是一种业务规范。
step2:

#!/bin/bash或者#!/bin/sh

指定脚本的解释器,及脚本的幻数。也就是脚本的执行环境!
step3:
脚本的内容是命令和命令的逻辑关系组成的
step4: 脚本的执行方式

方法一:
		chmod +x 脚本名称			##开启一个新的shell作为幻数
		脚本名称
举例:
[root@www ~]# vim test.sh
[root@www ~]# cat test.sh 
#!/bin/bash
echo `date`
[root@www ~]# chmod +x test.sh 
[root@www ~]# ./test.sh 
Tue Feb 26 09:04:03 EST 2019

方法二:
		source /root/test.sh		##以当前的sell作为幻数
举例:
[root@www ~]# source /root/test.sh 
Tue Feb 26 09:08:00 EST 2019
[root@www ~]# ls -l test.sh 
-rw-r--r--. 1 root root 24 Feb 26 09:03 test.sh		

方法三:
		sh /root/test.sh			##以sh作为当前脚本的幻数
举例:
[root@www ~]# sh test.sh 
Tue Feb 26 09:10:15 EST 2019
[root@www ~]# ls -l test.sh 
-rw-r--r--. 1 root root 24 Feb 26 09:03 test.sh

2、规范要求

1)脚本中应添加脚本的一些基本信息

例如:
Author:			ztc
Create_Date:	2019-2-28
Mail:			ztc@qq.ocm
Version:		1.0
Descripton:	This is a good script

这里给大家分享二种快速编写脚本信息的方法:
(1)

在编写代码前,在Vim的命令模式按F9就可以自动生成脚本信息(本人推荐)

vim /etc/vimrc
map <F9> ms:call REDHAT()<cr>'s
function REDHAT()
        call append(0,"####################################")
        call append(1,"# Author: zhao                      #")
        call append(2,"# Create_Date: ".strftime("%Y-%m-%d")."          #")
        call append(3,"# Mail: 1797876188@qq.com          #")
endfunction

(2)

在用vim创建以.sh、.script等新文件时,在文件中自动添加脚本基本信息。

autocmd BufNewFile *.sh,*.script,*.hpp exec ":call REDHAT()"			
function REDHAT()
        call append(0,"####################################")
        call append(1,"# Autho: zhao                      #")
        call append(2,"# Create_Date: ".strftime("%Y-%m-%d")."          #")
        call append(3,"# Mail: 1797876188@qq.com          #")
endfunction

2、脚本中尽量不使用中文,即使用pinyin代替。

3、脚本中出现的符号,例如:’’、""、<>、[]、{}、()最好成对编辑,避免自己漏掉符号

4、脚本中的代码缩进要做好,增加代码的可读性

5、写脚本时,功能可以一点点完善。易于排错。

三、常用的一些命令

1、diff命令

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

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

diff [options] target1 target2
diff file1 file2
diff direcory1 directory2

在这里插入图片描述
diff 在比较文件过程中结果读取方式说明

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

在这里插入图片描述
个人推荐vimdiff的用法:

vimdiff file1 file2

ctrl + w +左右可以切换光标所在的屏幕

在这里插入图片描述
这种用法,会将不同的地方高亮显示出来,而且支持vim更改!

diff常用的一些参数:

-b 或 --ignore-space-change  不检查空格字符的不同
-B 或 --ignore-blank-lines  不检查空白行
-c  显示全部内文,并标出不同之处
-i 或 --ignore-case  不检查大小写的不同
-p :若比较的文件为 C 语言的程序码文件时,显示差异所在的
函数名称;
-q 或 --brief :仅显示有无差异,不显示详细的信息
-r 或 --recursive :比较子目录中的文件
-u 以合并的方式来显示文件内容的不同

在这里插入图片描述

2、pacth命令

pacth命令是一个很有趣的命令。经常用于不同文件打布丁!

patch [options] file.old file.path
-b 标示备份源文件为file.orig

diff -u test1 test2 > test.path
patch -b test1 test.path    ##-b 标示备份源文件为file.orig

在这里插入图片描述

3、cut命令

cut命令多用于字符截取

cut 命令多用与字符截取
cut -d 指定分隔符
cut -f 1,7|1-7 指定截取的列
cut -c 1,4|1-4 指定截取的字符位置

示例:

cut +参数 截取的列或者位置 filename
[root@localhost mnt]# cat file1
hello world
Think you very much!
[root@localhost mnt]# cat file1 | cut -d ' ' -f 1
hello
Think
[root@localhost mnt]# cat file1 | cut -c 1-5
hello
Think
[root@localhost mnt]# cat file1 | cut -c 1-8
hello wo
Think yo
[root@localhost mnt]# cut -c 5-10 file1
o worl
k you

在这里插入图片描述

4、sort命令

sort命令多用于字符排序

sort -n	纯数字排序
sort -r 倒序
sort -u 去掉重复数字
sort -o 输出到指定文件中
sort -t 指定分隔符
sort -k 指定要排序的列
[root@localhost mnt]# vim file1
[root@localhost mnt]# cat file1 
34:12
645:53
435:98
34:34
3:23
15:42
6:42
3:24
1:42
35:54
532:23

在这里插入图片描述
在这里插入图片描述
uniq多用于重复字符做相应的处理

uniq -u 显示唯一的行
uniq -d 显示重复的行
uniq -c 每行显示一次并统计重复次数

示例:

sort -n file1 | uniq -d
sort -n file1 | uniq -c
sort -n file1 | uniq -u

在这里插入图片描述
在这里插入图片描述

5、&&和||

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

例如:
ping -c1 -w1 172.25.254.111 && echo up
ping -c1 -w1 172.25.254.111 || echo up

在这里插入图片描述

6、test命令

test 命令和 [] 等同

test "$A" == "$B" 等同 [ "$A" == "$B" ]
[ "$A" = "$B" ]		##两个变量是否相等
[ "$A" != "$B" ]	##两个变量是否不等
[ "$A" -eq "$B" ]	##两个变量的值是否相等
[ "$A" -ne "$B" ]	##两个变量的值是否不相等
[ "$A" -le "$B" ]	##$A的数值是否<=$b
[ "$A" -lt "$B" ]	##$A的数值是否<$B

在这里插入图片描述

["$A" -ge "$B" ]		##$A是否>=$B
["$A" -gt "$B" ]		##$A是否>$B
["$A" -ne "$B" -a "$A" -gt "$B" ]	##两个条件都满足为真
["$A" -ne "$B" -o "$A" -gt "$B" ]	##两个条件满足一个即位真
[-z "$A" ]				##字符串的长度等于0
[-n "$A" ]				##字符串的长度非0
["file1" -ef "file2" ]	##是否是同一个文件
["file1" -nt "file2" ]	##file1的Change时间是否比file2早
["file1" -ot "file2" ]	##file1的Change时间是否比file2晚

在这里插入图片描述
在这里插入图片描述

[-e "file" ]		##是否存在
[-f "file" ]		##是否是一个文件
[-L "file" ]		##是否是一个软链接
[-S "file" ]		##是否是一个套接字
[-b "file" ]		##是否是一个块设备
[-d "file" ]		##是否是一个目录
[-c "file" ]		##是否是一个字符设备

在这里插入图片描述

7、grep报告生成器

grep 命令的格式:
grep 匹配条件 处理条件

例如:
在这里插入图片描述

grep ^root passwd			##查找不是以root开头的行
grep root$ passwd			##查找不是以root结尾的行
grep -i root passwd			##忽略大小写区分
grep -E "root|ROOT" passwd	##E 后面的条件可以是一个正则表达式
grep 'w....s' passwd		##查找六个字母的以w开头s结尾的字符
grep 'w.....' passwd		##查找六个字母的以w开头的字符
grep '.....s' passwd		##查找六个字母的以s结尾的字符

在这里插入图片描述
示例:

grep -i root passwd
grep -i "\<root" passwd
grep -i "root\>" passwd
grep -i "\<root\>" passwd
grep -i "root$" passwd
grep -i "^root\>" passwd
grep -i "\<root$" passwd
grep -iE "^root\>|\<root$" passwd			##查找以root字段开头和以root字段结尾的行
grep -iE "^root\>|\<root$" passwd -v | grep "\<root\>"		##在不以root字段开头和root字段结尾的行

在这里插入图片描述

grep 中字符的匹配次数设定

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

在这里插入图片描述

8、sed行编辑器

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

sed 命令的格式

调用 sed 命令有两种形式:
	sed [options] 'command' file(s)
	sed [options] -f scriptfile file(s)

sed 对字符的处理

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

p模式操作:

-n 参数为禁止打印模式空间的内容

sed -n '/\#/p' fstab		##打印以#开头的行
sed -n '/UUID$/p' fstab
sed -n '/^UUID/p' fstab
sed -n '2,6p' fstab			##打印第二行到第六行的内容
sed -n '2,6!p' fstab		##打印除过第二行到第六行的内容

在这里插入图片描述
d模式操作:

sed '/^UUID/d' /etc/fstab		##打印除过以UUID开头的行
sed '/^#/d' /etc/fstab			##打印除过以#开头的行
sed '/^$/d'/etc/fstab			##打印除过空行的行
sed '1,4d'/etc/fstab			##打印除过第一行到第四行其他所有内容
sed '/^UUID/!d' /etc/fstab		##打印以UUID开头的行

在这里插入图片描述

cat -n fstab | sed -n -e '6!p'		##打印除过第六行其他的内容
sed -e '/^#/d' -e '/^$/d' fstab		##打印除过注释行和空行其他的内容
cat -n fstab | sed '4,6d'			##打印除过第四行到第六行的其它内容
cat -n fstab | sed -e '4d;6d'		##打印除过第四行和第六行的内容

在这里插入图片描述
a模式操作:

sed '/^UUID/ahello' /etc/fstab	##把fstab的文件的UUID的后面添加hello

在这里插入图片描述
i模式操作:

sed '/^UUID/ahello' /etc/fstab	##把fstab的文件的UUID的前面添加hello

在这里插入图片描述
c模式操作:

-i参数改变源文件的内容

sed '/^#/credhat' 	fstab		##把以#开头的行替换称redhat
sed 's/redhat/westos/g' fstab'	##把文件redhat替换称westos

在这里插入图片描述
w模式操作:

sed -n '/^#/w /mnt/testfile' fstab	##把fstab中的以#开头的行的内容重定向到/mnt/testfile
sed '6r/mnt/testfile' /mnt/fstab	##把testfile的内容添加到fstab的第六行
sed '6r/mnt/testfile' -i /mnt/fstab	##把testfile的内容添加到fstab的第六行,并且改变源文件内容
sed 'r/mnt/testfile' /mnt/fstab		##把testfile的内容添加到fstab的每一行

在这里插入图片描述
sed的其他用法:

sed -n '/^UUID/=' fstab		##显示关键内容的行号
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab
sed -f rulesfile file
sed 's/^\//#/'/etc/fstab
sed 's@^/@#@g'/etc/fstab
sed 's/\//#/'/etc/fstab
sed 's/\//#/g/'/etc/fstab


sed 'G' passwd			##每一行的后面添加空行
sed '$!G' passwd		##文件的除过最后一行的其他行,都在后面添加空行
sed '=' passwd | sed 'N; s/\n/ /'		##N选项为在模式空间中追加下一行输出
sed -n '$p' passwd

在这里插入图片描述
在这里插入图片描述

9、awk报告生成器

1、awk的处理机制

awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令

END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果

2、常用举例

awk -F : 'BEGIN{print "hello"}END{print "westos"}' passwd	##-F 指定分隔符号,在读入文本之前输出hello在处理完文本后,输出redhat
hello
redhat
awk -F : 'BEGIN{n=0}/bash$/{print $1;n++}END{print n}' passwd		##$1指匹配行的第一列字符
awk '/[a-d]/{print}' passwd
awk '/^[a-d]/{print}' passwd
awk '!/^[a-d]/{print}' passwd
awk '/^[^a-d]/{print}' passwd
awk '/^a|bash$/{print}' passwd
awk '!/^a|bash$/{print}' passwd
awk -F : '$6~/\<bin$/' passwd
awk -F : '$6!~/\<bin$/' passwd
awk -F : '{print NR,NF}' passwd		##第几行有第几列
awk -F : 'BEGIN{n=0}$6!~/^\/home/&&/bash$/{print $1;n++}END{print n}' /etc/passwd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10、find命令

find
		-name
        -maxdepth       ## find /etc -maxdepth 2 -name passwd
        -mindepth	##搜索深度
 
        -not		##类似与条件反选
        -user
        -group          ## 按文件所有组查找
        -a		##并且
        -o		##或者

        -size 20k	##文件大小
        -size -20k
        -size +20k

		-type		##查找文件的类型
		-ctime	10	##文件的时间等于十天会被查找		
		-ctime 	-10	##文件的内容被更改的时间
		-ctime  +10
		-cmin	10
		-cmin	+10
		-cmin	-10

		-perm -444	##查找到的文件必须权限含有r权限
		-perm  444	##查找444权限的文件
		-perm /444	##任意u、g、o一位包括r权限即会被查找到

示例:

size参数用法示例:
在这里插入图片描述
a、o参数及user、group参数示例:
在这里插入图片描述
-perm参数示例:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值