一、什么是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参数示例: