1 SHELL脚本常用命令
1.1 diff命令:
diff分析两个文件,并输出两个文件的不同的行。diff的输出结果表明需要对一个文件做怎样的操作之后才能与第二个文件相匹配【或者这么理解:与第一个文件相比,第二个文件发生了那些变化】
*)如何使用diff命令?
diff [options] target1 target2
diff file1 file2
diff directory1 directory2
*)diff在比较文件过程中结果读取方式:
[num1,nmu2][a | c | d][num3,num4]
num1.num2表示在第一个文件中的行数
a 表示添加 --add
c 表示更改 --change
d 表示删除 --delete
<表示第一个文件中的内容,>表示第二个文件中的内容,---分割线
num3,nmu4表示在第二个文件中的行数
2,4c2,4 表示改变第一个文件中的第二行和第四行才能匹配第二个文件中的第二行和第四行
*)diff在比较目录过程中结果的读取
only in directory/:filename
directory 表示在哪个目录中
filename 表示在这个文件
*)diff中常用的参数
-b 或 --ignore-space-change 不检查空格字符的不同
-B 或 --ignore-blank-lines 不检查空白行
-c 显示全部内容,并标出不同之处
-i 或 --igonre-case 不检查大小写的不同
-p 若比较的文件为c语言的程序码文件时,显示差异所在的函数名称
-q 或 --brief 仅显示有无差异,不显示详细的信息
-r 或 --recursive: 比较子目录中的文件 diff -r /mnt /opt
-u 以合并的方式来显示文件内容的不同
-C 1 显示不一样的行的邻近一行
-p 没有上面的参数
1.2 patch命令:
patch
用于文件不同文件打补丁
patch [options] file.old file.path
生成补丁文件 diff -u hello.c hello_diff.c > hello.path
cat hello.path
yum install patch -y
patch hello.c hello.path 用补丁文件对test.c进行修改
vim hello.c
1.3 cut命令:
*)cut
cut命令多用于字符截取
cut -d 指定分隔符
cut -f 1,7|1-7 指定截取的列
cut -c 1,4|1-4 指定截取的字符位置
例:cut -d : -f 1 passwd
cut -d : -f 1-3 passwd 1-3列
cut -c 2-4 passwd 截取2到4字符
cut -c2,4 passwd 截取第二个和第四个字符
1.4 sort命令:
*)sort
多用于字符排序
sort -n 纯数字排序
sort -r 倒序
sort -u 去掉重复数字
sort -o 输出到指定文件
sort -t 指定分隔符
sort -k 指定要排序的列 (默认排第一列)
例:sort -nr test
sort -nru test
sort -nru test -o westos
cat westos
假如有两列,以冒号隔开,sort -n test 默认排第一列
要是想排第二列的话: sort -t : -k 2 -n test
1.5 uniq命令:
*)uniq
对重复字符做相应的处理
uniq -u 显示唯一的行
-d 显示重复的行
-c 每行显示一次并统计重复次数
sort test
sort -n test
sort -nu test
sort -n test | uniq -c 显示结果中前面一行是出现的次数 后面一行是数字内容
sort -n test | uniq -d 出现次数大于1次的
sort -n test | uniq -u 仅出现一次的
怎么找出last -i 输出结果中登陆次数最多的ip地址
last -i | grep 0.0.0.0 -v | grep wtmp -v | cut -d " " -f 14 | uniq -c | sort -nr -t " " -k 5 | head -n 1
或者
last -i | grep 0.0.0.0 -v | grep wtmp -v | cut -d " " -f 14 | uniq -c | sort -nr | head -n 1
1.6 && 和 ||命令:
*)&& 和 ||
&&用来执行条件成立后执行的命令
||用来执行条件不成立后执行的命令
例如:
ping -c1 -w1 172.25.254.72 &> /dev/null && echo up || echo down
编写脚本实现自动返回能否ping通的结果
#!/bin/bash
ping -c1 -w1 $1 &> /dev/null && echo $1 is up || echo $1 is down
或者可以加颜色:
#!/bin/bash
ping -c1 -w1 $1 &> /dev/null && {
echo -e "\033[32m$1 is up\033[0m"
} || {
echo -e "\033[31m$1 is down\033[0m"
}
加上判断输入是否为空的条件
#!/bin/bash
【 -z "$1"】&& {
echo "error:please input ipadderss"
exit
}
ping -c1 -w1 $1 &> /dev/null && echo $1 is up || echo $1 is down
1.7 test命令:
test命令一:
test命令和[ ]等同
test "$A" == "$B" 等同 ["$A" == "$B"]
["$A" = "$B"] A与B相等
["$A" != "$B"] A与B不相等
[ ! "$A" = "$B" ] 条件成立的相反
["$A" -eq "$B"] 相等
["$A" -ne "$B"] 不等
["$A" -le "$B"] 小与等与
["$A" -lt "$B"] 小于
["$A" -ge "$B"] 大于等于
["$A" -gt "$B"] 大于
["$A" -ne "$B" -a "$A" -gt "$B"] 两个条件都要满足
["$A" -ne "$B" -o "$A" -gt "$B"] 满足其中一个条件即可
[-z "$A"] 表示a的值是不是为空
[-n "$A"] 不为空
["file1" -ef "file2"] 是否互为硬链接
["file1" -nt "file2"] 前面的文件是否新于后面的文件
["file1" -ot "file2"] 前面的文件是否旧于后面的文件
#######设置当根目录的使用率超过80%就提示,每分钟一次########
第一种:#!/bin/bash
["`df -h / | tail -n 1 | cut -d " " -f 15 | cut -d "%" -f 1`" -ge "30" ]&& {
echo "warning: / is full!!" >> /var/log/messages
}
at now+1min <<-EOF
/mnt/checkstorage.sh
EOF
第二种:a=(`df -h / | tail -n 1`)
echo ${a[4]} | cut -d "%" -f 1
第三种:df -h \ | tail -n1 | awk '{print $5}'
*)test命令二:
[-e "file"] -e 文件是否存在
[-f "file"] -f 是否普通文件
[-l "file"] -l 是否软链接
[-es "file"] -s 是否套接字
[-b "file"] -b 块设备
[-d "file"] -d 是否目录
[-c "file"] -c 字符设备
现在先介绍一下:软链接与硬链接
我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
硬链接:为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名
由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能交叉文件系统进行硬链接的创建;
不能对目录进行创建,只可对文件创建;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。
软链接:软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。
软链接的创建与使用没有类似硬链接的诸多限制:
软链接有自己的文件属性及权限等;
可对不存在的文件或目录创建软链接;
软链接可交叉文件系统;
软链接可对文件或目录创建;
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
软硬链接的创建:
cd /mnt
ln /mnt/ping.sh /mnt/westos 创建硬连接
ls -i 可以看节点号
ls -l
ln -s /mnt/ping.sh /mnt/westos1 创建软连接
ls -l
rm -fr /mnt/ping.sh
ls -l
cat /mnt/westos1
rm -fr westos1 删除了节点号
*如何判断一个文件的类型
#!/bin/bash
【 -z "$1"】&& {
echo "error:please input a file following scripts"
exit
}
[-e "$1"] || {
echo "$1 is on exist"
exit
}
[-L "$1"] || {
echo "$1 is link file"
exit
}
..........
1.8 tr命令:
*)tr命令
#!/bin/bash
echo $1 | tr 'a-z' 'A-Z' #将a-z 转化成A-Z
2 SHELL脚本文本处理命令(一)
2.1 grep
grep :global search regular expression and print out the line
全面搜索研究正则表达式并显示出来
grep命令是一种强大的文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查打印匹配到的行
由正则表达式或者字符及基本文本字符所编写的过滤条件,为贪婪匹配,只要存在字符串都会显示出来
grep正则表达式与扩展正则表达式:
正规的grep不支持扩展的正则表达式,竖线是用于表示“或”的扩展正则表达式元字符,正规的grep
无法识别,加上反斜杠,这个字符就被翻译成扩展正则表达式,就像egrep和grep -E 一样
grep的格式:
grep 匹配条件 处理文件
grep root passwd
grep ^root passwd 以root开头的行
grep "root|bash" passwd 不行
egrep "root | bash" passwd = grep -E "root | bash" passwd 搜索root或者bash的行
grep -E "^root | bash$" passwd
grep root$ passwd 以root结尾的行
grep -i root passwd 忽略大小写
grep -i root passwd -v 反向匹配
cat -b passwd | grep games -2 匹配行以及上下两行
cat -b passwd | grep games -A2 匹配行以及下两行
cat -b passwd | grep games -B2 匹配行以及上两行
显示可以登陆系统的用户的名称:
#!/bin/bash
grep -E "sh$" /etc/passwd | cut -d : -f 1
*)grep中的正则表达式
^westos
westos$
'w....s'
'w....'
'....s'
grep w...s test
grep w....s test
*)grep中字符的匹配次数设定
* 字符出现【0-任意次】
\? 0-1次
\+ 字符出现1-任意次
\{n\} 字符出现n次
|{m,n\} 最少出现m次,最多出现n次
\{0,n\} 0-n次
\{m,\} 至少m次
\(xy\)\{n\}xy 关键字出现n次
.* 关键字之间匹配任意字符
grep xy test
grep x*y test
grep -E 'x?y' test
grep -E 'x+y' test
grep -E 'x{2}y' test
grep -E 'x{2,3}y' test
grep -E 'x{2,}y' test
grep -E 'x{,2}y' test
grep -E '(xy){2,}' test
grep -E 'x.*y' test
grep中字符的匹配位置设定
^关键字
关键字$
\<关键字
关键字\>
\<关键字\>
grep -E "\<root" /etc/passwd 以root开头的行
grep -E "\<root\>" passwd 匹配行以root开始
例:摘出eth0网卡中ipv4的ip地址
ifconfig eth0 | grep -E "\<inet\>" | cut -d " " -f 10
2.2 sed:行编辑器
sed(stream editor):用来操作纯 ASCII 码的文本
Sed 一次处理一行内容 处理时,把当前处理的行存储在临时缓冲区中,称之为“模式空间”(pattern space)
可以指定仅仅处理哪些行,Sed 符合模式条件的处理,不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行,这样不断重复,直到文件末尾
sed命令格式
调用sed命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f 'command' file(s)
sed对字符的处理
p 显示,将某个选择的数据打印显示。通常 p 会与参数 sed -n 一起执行
d 删除,显示模式空间删除指定行后的内容,不会对原文件数据删除
a 添加,a 的后面可以接字符串,该字符串会在当前指定行的下一行出现
c 更改, c 的后面可以接字符串,该字符串可以取代 n1,n2 之间的行
i 插入, i 的后面可以接字符串,该字符串会在当前指定行的上一行出现
2.2.1 p操作模式
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
cat fstab -n | sed 5p
cat fstab -n | sed -n 5p
cat fstab -n | sed -n 3,5p 3到5行
cat fstab -n | sed -n '3p;5p' 3行或5行
sed -n '/#/p' fstab
sed -n '/#/!p' fstab
sed -n '/^$/!p' fstab
例:使用一个内含用户名的文件,执行脚本后可以从文件的第一行执行到最后一行,建立所有的用户。
2.2.2 d操作模式
d模式操作
sed '/^UUID/d' /etc/fstab
sed '/^#/d' /etc/fstab
sed '/^$/d' /etc/fstab
sed '1,4d' /etc/fstab
sed -n '/^UUID/!d' /etc/fstab
cat -n fstab | sed '3d' ##删除第三行内容
cat -n fstab | sed '3,5d' ##删除3到5行的内容
cat -n fstab | sed '3d;5d' ##删除第三和第五行内容
2.2.3 a操作模式
a模式操作:
sed '/^UUID/ahello westos' /etc/fstab
sed '/^UUID/ahello\nwestos' /etc/fstab
2.2.4 i操作模式
i模式操作
sed '4ihello\nwestos' fstab ##在第四行插入两行内容hello,westos
sed '/#/c**' -i fstab ##将模式空间修改的内容保存到原文件中
2.2.5 c操作模式
c模式操作
sed '/^#/chello westos' /etc/fstab
将httpd端口改成命令行输入的端口
#!/bin/bash
[ -z "$1" ] && {
echo "echo:please input number following script"
exit
}
sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
2.2.6 w操作模式
w模式操作
sed -n '/^UUID/w file' fstab ##把UUID开头的行内容保存到file文件中
sed '$=' fstab ##统计文件的行数,并在最后一行的上一行显示总行数
sed -n '$=' fstab ##只显统计文件的行数
sed '7r /mnt/file' fstab ##把file文件的内容插入到fstab第7行的下面
2.2.7 其他用法
sed的其他用法
sed -n '/^UUID/p' fstab ##只显示UUID开头的那一行
sed -n -e '/^UUID/p' -e '/^#/p' fstab ##显示UUID开头和#开头的行,-e可以在同意行执行多条命令
sed -n -f rule fstab ##-f调用命令文件来直接操作文件
sed 's/sbin/westos/g' passwd ##把文件中所有行所有列的sbin换成westos
sed '1,5s/sbin/westos/g' passwd ##把文件中1到5行的sbin替换成westos
sed的其他用法
sed '/lp/,/halt/s/sbin/westos/g' passwd ##替换lp行到halt行的sbin
sed 's/\///g' passwd ##将/转换成空,即删掉/,加\是因为/有特殊的含义,需要转义
sed 's@sbin@westos@g' passwd ##把文件中的所有sbin转换成westos,在这里@字符与/的含义相同
sed的其他用法
sed 'G' fstab ##给每一行后面都加一个空行
sed '=' fstab ##给每一行的上面都加一个行号
sed '=' fstab | sed 'N;s/\n/ /g' ##让行号显示在每行的前面,取消换行
############################The End#############################