目录
2、sed [选项参数] ‘command’ filename
3、awk [选项参数] ‘pattern 1 {action} pattern 2 {action} ........’ filename
4、sort(选项)(参数) 将文件进行排序,并将排序结果有序输出。
十二、根据应用名称查找其进程号再找其所占用的端口号shell脚本
一、shell是什么
shell命令解释器,是一个程序。提供很多功能。
#!/bin/sh
#!/bin/bash
这俩都是让别人执行,让sh解释器或者是bash解释器执行,不需要赋予权限
./ 自己执行,需要赋予执行的权限
二、实践
- 需求:创建一个脚本实现:在一个路径下创建文件,在文件下添加文本。
1、创建.sh文件:
touch kk.sh
2、编辑:
vi kk.sh
3、输入内容:
cd /home/路径
touch wenjianming.txt
echo “wenbenneirong” >> wenjianming.txt
:wq
4、执行:bash kk.sh
sh kk.sh
./ kk.sh
三、shell中的变量
1、系统变量
$HOME : echo $HOME 获取家目录
$PWD: echo $PWD 获取当前所在目录
$SHELL: echo $SHELL 获取shell所在目录
$USER: echo $USER 获取当前用户名
2、自定义变量
定义变量: 变量名=值 等号左右不可以有空格
撤销变量: unset 变量名
声明一个静态变量: readonly 变量=值 注意:静态变量不能unset
变量定义规则:
- 变量名称可以由字母、数字、下划线组成,不能以数字开头,环境变量名建议大写。
- bash中变量类型默认为字符串类型,无法进行数值运算。取数值需要前面加上$。
- 变量的值如果有空格需要使用引号把整个值括起来。
- 可把变量提升为全局变量,可供其他shell程序使用。
export 变量名
3、系统提供的特殊变量
- $n
功能描述:n代表数字
$0 代表该脚本(.sh文件的名字)名称
$1-$9 代表第1到第9个参数
${10} 10及以上的参数需要用大括号括上
应用:
创建sh文件:
touch parameter.sh
vim parameter.sh
编辑:#!/bin/bash
Echo “$0 $1 $2 $3”
使用sh文件:bash parameter.sh word1 word2 word3
即可显示出:文件名 第一个参数 第二个参数 第三个参数
- $#:功能:获取所有输入参数个数,常用于循环。
- $*:功能:把所有的参数看成一个整体,代表所有参数
- $@:功能:把每个参数区分对待,代表所有参数
- $?:功能:最后一次执行命令的返回状态,为0执行正确,非0(自己设定)为执行不正确。
echo $#
echo $*
echo $@
echo $?
四、运算符
语法:$((运算式)) 或 $[运算式]
例如:s=$[(2+3)*4]
echo $s
expr: + - \* / % 加减乘除取余 expr运算符间必须有空格
例如:expr 3 + 2 +两侧有空格
expr `expr 3 + 2` \* 4
五、条件判断
$ [ 条件 ] 条件前后有空格, [ 和 ] 前后有空格
条件非空即为true,[ ]返回false。
1、常用判断条件
1、两个整数之间的比较
= 字符串比较
-lt 小于(less than)
-le 小于等于(less equal)
-eq 等于(equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
-ne 不等于(not equal)
2、按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
3、按照文件类型进行判断
-f 文件存在并且是一个常规文件(file)
-e 文件存在(exit)
-d 文件存在并且是一个目录(directory)
2、操作实例
两整数比较大小:
$ [ 23 -ge 22 ]
echo $?
helloword.sh文件是否有写权限:
$ [ -w helloword.sh ]
echo $?
判断一个路径下的具体文件是否存在:
$ [ -e 路径/文件 ]
echo $?
3、多条件判断
&&表示上一条命令成功时才执行下一条命令
||表示上一条命令失败时才执行下一条命令
$ [ 条件 ] && echo OK || echo notok ||后面的不执行
$ [ 条件 ] && [ ] || echo notok || 后面的执行
六、流程控制
1、if判断
if [ 条件判断式 ];then
程序1
fi
或者
if [ 条件判断式 ]
Then
程序
fi
注意:
中括号和条件判断之间必须要有空格
if后要有空格
案例实操:
输入一个数字,如果是1 ,则输出banzhang zhen shuai ,如果是2,则输出 kk zhen mei,如果是其他,则什么也不输出。
touch fi.sh
vim fi.sh
#!/bin/bash
if [ $1 -eq 1 ]
Then
Echo “banzhang zhen shuai”
elif [ $1 -eq 2 ]
Then
Echo “kk zhen mei”
fi
2、case语句
case $变量名 in
“值1”)
如果变量的值等于1,则执行程序1
;;
“值2”)
如果变量的值等于2,则执行程序2
;;
..............
*)
如果变量的值都不是以上的值,则执行此程序。
;;
esac
案例实操
输入一个数字,如果是1,则输出bangzhan,如果是2,则输出kk,如果是其他,则输出dalao。
#!/bin/bash
case $1 in
1)
echo “banzhang”
;;
2)
echo “kk”
;;
*)
echo “dalao”
;;
esac
3、for循环
语法1:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
案例实操:
从1加到100:
#!/bin/bash
s=1
for (( i=1;i<=100;i++ ))
do
s=$[ $s+$i ]
done
echo $s
语法2:
for 变量 in 值1 值2 值3.......
do
程序
done
案例实操:
打印所有输入参数:
#!/bin/bash
#打印数字
for i in $* 或者$i ——这里使用”$*”和”$@”二者有区别:一次性全给和一个一个取
do
echo “banzhang xihuan $i”
done
4、while循环
while [ 条件判断式 ]
do
程序
done
案例实操:
从1加到100:
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s + $i]
done
七、read读取控制台输入
read(选项)(变量)
选项:
-p:指定读取值时的提示符 读取输入的值,赋给变量
-t:指定读取值时的等待时间(秒)
变量:
指定读取值的变量名
案例实操:
read -t 7 -p “Enter your name in 7 seconds:” NAME
echo $NAME
八、函数
1、系统函数
basename [string / pathname] [suffix]
basename命令会删掉所有的前缀,包括最后一个字(‘/’)符,然后将字符串显示出来即获取路径里的文件名称,带后缀
suffix为后缀,如果后缀被指定了,basename会将pathname或string中的后缀去掉
若制定了后缀,即获取不带后缀的文件名
例:
basename 路径/文件名 按回车返回带后缀的文件名
basename 路径/文件名 .txt 按回车返回不带后缀的文件名
dirname 文件的绝对路径
从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录部分)
2、自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
funname
必须在调用函数的地方之前,先声明这个函数,shell脚本是逐行运行的。
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)
案例实操:
求和函数:
#!/bin/bash
function sum()
{
s=0;
s=$[$1 + $2]
echo $s
}
read -p “input your parameter1:” n1
read -p “input your parameter2:” n2
sum $n1 $n2 ——调用sum函数
九、shell自带的工具(重点)
1、cut [选项参数] filename
剪切数据使用,从文件的每一行剪切字节、字符和字段,并将剪切结果输出。
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列;默认分隔符是制表符\t
案例实操:
一个带有以下内容的cut.txt文件:
guang shen
dong zhen
wo wo
lai lai
le le
取第一列:cut -d “ ” -f 1 cut.txt
取第二、三列:cut -d “ ” -f 2,3 cut.txt
取guang:cat cut.txt | grep guang | cut -d “ ” -f 1
选取系统PATH变量,第2个“:”开始后的所有路径:echo $PATH | cut -d “:” -f 3-
3-:代表第三列之后所有的
切割ipconfig后打印的IP地址:ifconfig eth0 | grep “inet addr”------获取IP所在行
ifconfig eth0 | grep “inet addr” | cut -d : -f 2 | cut -d “ ” -f 1
2、sed [选项参数] ‘command’ filename
一种流编辑器,一次处理一行内容,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,直到文件末尾。文件内容并没有改变。除非使用重定向存储输出。
选项参数:-e:直接在指令列模式上进行sed动作的编辑。
命令:
a:新增,a的后面可以接字串,在下一行出现。
d:删除
s:查找并替换
案例实操:
准备数据:touch sed.txt
vim sed.txt
dong shen
guan zhen
wo wo
lai lai
le le
1、将“mei nv”这个单词插入到sed.txt文件的第二行,打印。
sed “2a mei nv” sed.txt
——源文件并不会改变,只是打印出来了
2、删除sed.txt文件中包含有“wo”的行。
sed “/wo/d” sed.txt
3、将sed.txt文件中的“wo”替换成“ni”。
sed “s/wo/ni/g” sed.txt
——加上g代表全局替换,如果不加只替换第一个globle
4、将sed.txt文件中第二行删除并将“wo”替换成“ni”。
sed -e “2d” -e “s/wo/ni/g” sed.txt
3、awk [选项参数] ‘pattern 1 {action} pattern 2 {action} ........’ filename
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片切开的部分在进行分析处理。
parttern:表示AWK在数据中查找的内容,就是匹配模式。
action:在找到匹配内容时所执行的一系列命令。
选项参数:
-F 指定输入文件拆分隔符
-v 赋值一个用户定义变量
案例实操
sudo cp /etc/passwd ./
sudo chown wodemingzi:wodemingzi passwd
cat passwd
1、搜索以root关键字开头的所有行,并输出该行的第7列
awk -F : ‘/^root/ {print $7}’ passwd
2、搜索以root关键字开头的所有行,并输出该行的第1列和第7列,中间以,分割
awk -F : ‘/^root/ {print $1 “,” $7}’ passwd
3、只显示/etc/passwd的第一列和第七列,以逗号分隔,且在所有行前面添加列名user,shell在最后一行添加”dahaige,/bin/zuishuai”。
awk -F : ‘BEGIN{print “user,shell”} {print $1 “,” $7} END{pring “dahaige,/bin/zuishuai”}’ passwd
BEGIN 所有数据读取行之前执行
END 所有数据读取之后执行
4、用户id增加数值1并输出
awk -F : -v i=1 ‘{print $3 + i}’
awk的内置变量:
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数(切割后,列的个数)
5、统计passwd文件名,每行的行号,每列的列数
awk -F : ‘{print “filename:” FILENAME “,linenumber:” NR “,columns:” NF}’ passwd
6、切割IP
ifconfig eth0 | grep “inet addr” | awk -F : ‘{print $2}’ | awk -F “ ” ‘{print $1}’
7、查询sed.txt中空行所在的行号
awk ‘/^$/ {print NR}’ sed.txt ——是一道面试题
4、sort(选项)(参数) 将文件进行排序,并将排序结果有序输出。
选项:
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分割字符
-k 指定需要排序的列
参数:指定待排序的文件列表
案例实操:
数据准备:touch sort.sh
vim sort.sh
按照第二列处理:
sort -t : -nrk 2 sort.sh
十、企业真实面试题
- 京东
问题1:使用Linux命令查询文件中空行所在的行号。
awk ‘/^$/ {print NR}’ set.txt
问题2:有文件chengji.txt的内容如下:
张三 40
李四 50
王五 60
使用Linux命令计算第二列的和并输出。
cat chengji.txt | awk -F “ ” ‘{sum+=$2} END{print sum}’
- 腾讯&搜狐
问题1:shell脚本里如何检查一个file文件是否存在?如果不存在该如何处理?
#!/bin/bash
if [ -f file.txt ]
then
echo “文件存在!”
else echo “文件不存在!”
fi
- 新浪
问题1:用shell写一个脚本,对文本中无序的一列数字排序。
sort -n 文件名
问题2:对文本中无序的一列数字排序并求和。
sort -n 文件名 | awk ‘{a+=$0;print $0} END{print “sum” a}’
- 金和网络
问题1:查找当前文件夹(/home)下所有文本文件内容中包含有字符“shen”的文件名称。
grep -r “shen” | cut -d : -f 2
十一、启动程序的两种方式
bash ./
十二、根据应用名称查找其进程号再找其所占用的端口号shell脚本
bb={ps -elf | grep 应用名称 | awk {print $3}}
netstat -natup|grep $bb | grep :::