2.1概述
Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核。
2.2 Shell中的变量
-
$n ( n为数字,$0代表该脚本名称,$1- 9 代表第一到第九个参数,十以上参数 : 9代表第一到第九个参数,十以上参数: 9代表第一到第九个参数,十以上参数:{10})。
-
$# (获取所有输入参数个数,常用于循环)
-
∗ ( 代表命令行中所有的参数, * (代表命令行中所有的参数, ∗(代表命令行中所有的参数,*把所有参数看成一个整体)
-
@ ( 代表命令行中所有的参数,不过 @ (代表命令行中所有的参数,不过 @(代表命令行中所有的参数,不过@把每个参数区分对待)
$* 和 $@区别在加了“”后的效果不同:
∗ 和 *和 ∗和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2 … 2 … 2…n的形式输出所有参数。
当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2…n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2”…”n”的形式输出所有参数。
- $? (最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果非0(具体哪一个数,由命令自己决定),则证明上一个命令执行不正确)。
2.3 运算符
$((运算式)) 或者 $[运算式]
expr + , -, * , /, % 加,减,乘,除,取余
注意:expr 运算符间要有空格
2.4 条件判断
[ condition ] (注意 condition 前后要有空格)
常用的判断条件:
(1) 两个数之间比较
= 字符串比较 (注意必须加空格,否则就是一个非空字符串,始终返回true)
[ a = b ]
-lt 小于 -le 小于等于 举例 [ 23 -ge 22 ]
-eq 等于 -gt 大于
-ge 大于等于 -ne 不等于
(2) 文件权限判断
-r 有读的权限 eg: [ -w hello.sh ]
-w 有写的权限
-x 有执行的权限
(3) 按照文件类型判断
-f 文件存在并且是一个常规文件 eg [ -f /home/h.txt ]
-e 文件存在
-d 文件存在并是一个目录
(4) 多条判断(&& 表示前一条命令执行成功才会执行后面,|| 表示上一条执行失败后才会执行下一条)
2.5 流程控制
if判断:
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
完整结构
if [条件表达式]
then
程序
elif [条件表达式]
then
程序
else
程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
case语句
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
-
case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
-
双分号“;;”表示命令序列结束,相当于java中的break。
-
最后的“*)”表示默认模式,相当于java中的default。
for循环:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值1 值2 值3…
do
程序
done
while循环:
while [ 条件判断式 ]
do
程序
done
2.6 Shell工具(重点)
2.6.1 cut
cut [选项参数] filename
默认分隔符是制表符
选项参数:
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
举例:cut -d “ ” -f 2 cut.txt 以空格为分隔符,切割第二列
如果出现 -f 2- 2-表示第二列以后所有的列
2.6.2 sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed [选项参数] ‘command’ filename
选项参数:
-e 直接在指令列模式上进行sed的动作编辑
命令功能描述:
a : 新增,a的后面可以接字符串,在下一行出现
d:删除
s:查找并替换
举例:sed ‘2a haha’ sed.txt :将haha插入到sed.txt文件第二行下
(注意:这里原本文件并没有改变)
举例:sed ‘/wo/d’ sed.txt : 删除sed.txt文件所有包含wo的行
举例:sed ‘s/wo/ni/g’ sed.txt : 将sed.txt文件中所有wo替换为ni
这里‘g’ 表示全局替换
举例:sed -e ‘2d’ -e ‘s/wo/ni/g’ sed.txt : 将sed.txt文件中的第二行删除并将wo替换为ni
注意:如果执行多条相同的命令,不加-e只会执行一个
2.6.3 awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理.
awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示awk在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
注意:这里的模式匹配需要使用单引号,因为双引号会对正则的一些特殊符号处理
选项参数:
-f 指定输入文件折分隔符
-v 赋值一个用户定义变量
1)搜索passwd文件以root关键字开头的所有行,使用冒号切分,并输出该行的第7列。
[hadoop102 datas]$ awk -F: ‘/^root/{print $7}’ passwd
/bin/bash
(2)搜索passwd文件以root关键字开头的所有行,使用冒号切分,并输出该行的第1列和第7列,中间以“,”号分割。
[hadoop102 datas]$ awk -F: ‘/^root/{print $1","$7}’ passwd
root,/bin/bash
注意:只有匹配了pattern的行才会执行action
(3)对/etc/passwd用冒号切分后,只显示第一列和第七列,然后以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"lisi,/bin/zuishuai"。
[hadoop102 datas]$ awk -F : ‘BEGIN{print “user, shell”} {print $1","$7} END{print “lisi,/bin/zuishuai”}’ passwd
user, shell
root,/bin/bash
bin,/sbin/nologin
。。。
aaaaa,/bin/bash
lisi,/bin/zuishuai
注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
(4)将passwd文件中的用户id增加数值1并输出 注意:i取值的时候不需要加$
[hadoop102 datas]$ awk -v i=1 -F: ‘{print $3+i}’ passwd
1
2
3
4
awk的内置变量
变量 说明
FILENAME 文件名
NR 已读的记录数(行数)
NF 浏览记录的域的个数(切割后,列的个数)
Linux:awk与cut命令的区别
awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的;
cut则是以单个空格作为分隔符。
例如:awk -F " " ‘{print $2}’ cut.txt
2.6.4 sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
sort(选项)(参数)
选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列
参数:指定待排序的文件列表
(1) 按照“:”分割后的第三列倒序排序。
[hadoop100 datas]$ sort -t : -nrk 3 sort.txt