22.Linux 中shell脚本 、sed和awk命令

shell脚本

我们所输入的命令计算机是不识别的,这时就需要一种程序帮助我们进行翻译,变成计算机所识别的二进制程序,同时又将计算机所执行的结果翻译给我们
linux的shell脚本是一种特殊的应用程序,常见的shell解释器有很多种使用不同的shell时期内部指令命令提示方式方面会存在一些区别,可以通过/etc/shells文件查看


22.Linux 中shell脚本 、sed和awk命令_第1张图片
/etc/shells文件查看
[root@JhouShuai ~]# vim first.sh
#! /bin/bash 
mkdir /root/myfirstShell
ifconfig

[root@JhouShuai ~]# chmod +x first.sh 
[root@JhouShuai ~]# ll first.sh 
-rwxr-xr-x 1 root root 49 3月  10 18:06 first.sh
[root@JhouShuai ~]# 


22.Linux 中shell脚本 、sed和awk命令_第2张图片
./first.sh执行效果

22.Linux 中shell脚本 、sed和awk命令_第3张图片
./first.sh执行效果

注释:

#!/bin/bash 主要是为了声明,我以下所写的均为bash语言(我是用的是bash解释器)
第二行为注释行,注释信息不生效, #后面表示注释
再往后即执行的命令
执行脚本的不同方式
第一种使用绝对路径执行,前提是要有x权限
第二种使用相对路径执行,如./的方式
第三种使用 sh命令来执行 格式: sh /路径/脚本文件名.sh 不需要执行权限
第四种使用 bash命令来执行 格式: bash /路径/脚本文件名.sh 不需要执行权限
第五种 . 文件名
第六种source 文件名

变量

定义是:可以存放一个可变的值的空间
常见的shell变量有自定义变量、环境变量、位置变量、预定义变量
一般使用echo 输出变量的值

1、自定义变量
自定义变量是用户根据自己的环境自己定义的变量
Bash中比较简单的变量,不用进行提前声明,而是直接指定变量名称并赋给初始值;
定义变量的基本格式为变量名=变量值等号两遍不允许出现空格;
变量名称只能以字母和下划线开头,名称中不能包含+、- * 、 / . , 、 ? % * …… 等一些特殊字符
严格区分大小写

[root@JhouShuai ~]# name="ZhouShuai"
[root@JhouShuai ~]# echo $name
ZhouShuai
[root@JhouShuai ~]# Name="Lily"
[root@JhouShuai ~]# echo $Name
Lily
[root@JhouShuai ~]# 
#可以直接在命令行定义,以上就是定义一个变量并赋予值,通过echo进行输出变量 $是引用变量的特殊字符(必须使用$符号)
#echo和调用的变量之间必须要有空格


[root@JhouShuai ~]# echo $name $Name    #直接使用echo 后面跟$调用的变量 如果有多个则空格隔开
ZhouShuai Lily
[root@JhouShuai ~]# echo $name$Name
ZhouShuaiLily
[root@JhouShuai ~]# echo $name$Namelove
ZhouShuai
[root@JhouShuai ~]# echo To$name$Namelove
ToZhouShuai
[root@JhouShuai ~]# echo To$name$Name"love"
ToZhouShuaiLilylove
[root@JhouShuai ~]# echo To$name${Name}love   #当变量名和后面的字符容易混淆的时候应该使用{}将变量名括起来
ToZhouShuaiLilylove
[root@JhouShuai ~]# echo To$name$Name\love
ToZhouShuaiLilylove
[root@JhouShuai ~]# 

#read命令
#除了上面的赋值之外还可以使用read命令进行赋值,
#read命令用来提示用户输入信息,
#从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)
#执行时需要从标准输入设备键盘读取一行,并以空格为分隔符
[root@JhouShuai ~]# read a b
1 2
[root@JhouShuai ~]# echo $a $b
1 2
[root@JhouShuai ~]# echo $a
1
[root@JhouShuai ~]# echo $b
2
[root@JhouShuai ~]# 


#为了交互式更加的形象,提高易用性,加上 -p选项来设置提示信息
[root@JhouShuai ~]# read -p 'input your name:' acount
input your name:zhoushuai
[root@JhouShuai ~]# echo $acount
zhoushuai
[root@JhouShuai ~]# 

数值变量的运算

shell脚本的数值运算多用于脚本程序的过程控制(如循环次数,使用量比较等)
在shell环境中,只能进行比较简单的整数运算
运算符与变量之间必须有一个空格位,整数的运算主要是通过内部命令expr 命令进行运算
格式 变量1 运算符 变量2
其中 变量1 、变量2 ……对应的需要计算的数值变量(需要$符号调用)常用的几种运算符如下所示
加法运算:+
减法运算: -
乘法运算: *
除法运算: /
求模(取余)运算: %
我们使用这几种运算符进行变量的运算 小数不支持


22.Linux 中shell脚本 、sed和awk命令_第4张图片
变量的运算
[root@JhouShuai ~]# a=10
[root@JhouShuai ~]# b=20
[root@JhouShuai ~]# expr $a + $b
30
[root@JhouShuai ~]# expr $a - $b
-10
[root@JhouShuai ~]# expr $a * $b
expr: 语法错误
[root@JhouShuai ~]# expr $a \* $b
200
[root@JhouShuai ~]# expr $a / $b
0
[root@JhouShuai ~]# expr $a % $b
10
[root@JhouShuai ~]# abc= `expr $a + $b`
bash: 30: 未找到命令...
[root@JhouShuai ~]# abc=`expr $a + $b`
[root@JhouShuai ~]# echo $abc
30
[root@JhouShuai ~]# abc=$(expr $a \* $b)
[root@JhouShuai ~]# echo $abc
200
[root@JhouShuai ~]# 

特殊shell变量

1、环境变量:

环境变量是指系统本身运行需要由linux系统提前创建好的一类变量.
主要用于用户的工作环境,包括(用户的宿主目录,命令的查找路径,用户的当前目录,登录的终端等)环境变量的值由操作系统本身自己维护,随着用户的状态改变而改变
使用env命令来调取当前环境变量


22.Linux 中shell脚本 、sed和awk命令_第5张图片
当前环境变量

22.Linux 中shell脚本 、sed和awk命令_第6张图片
环境变量
[root@JhouShuai ~]# echo $PWD
/root
[root@JhouShuai ~]# pwd
/root
[root@JhouShuai ~]# cd /etc/
[root@JhouShuai etc]# echo $PWD
/etc
[root@JhouShuai etc]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@JhouShuai etc]# echo $USER
root
[root@JhouShuai etc]# su - zhoushuai
上一次登录:四 2月 28 21:48:14 CST 2019pts/2 上
[zhoushuai@JhouShuai ~]$ echo $USER
zhoushuai
[zhoushuai@JhouShuai ~]$ su -
密码:
上一次登录:日 3月 10 19:21:33 CST 2019从 192.168.31.14pts/0 上
[root@JhouShuai ~]# echo $SHELL
/bin/bash
[root@JhouShuai ~]# echo $HOME
/root
[root@JhouShuai ~]# 

2、位置变量

为了使用shell脚本程序:是方便通过命令行为程序提供参数Bash引用了位置变量的概念,
当执行命令行操作时第一个字段表示命令字或程序名,其余的字符串参数按照从左到右的顺序依次给位置变量赋值
位置变量也叫位置参数,使用$1 $2 $3 …$9表示
vim add.sh #写入以下内容


22.Linux 中shell脚本 、sed和awk命令_第7张图片
add.sh

[root@JhouShuai ~]# sh -n add.sh 
[root@JhouShuai ~]# ./add.sh 10 20
10 + 20 = 30

3、预定义变量

$#:命令行中位置变量的个数(程序执行了几个位置参数)
$*:所有位置变量的内容(具体的内容 比如/boot就是一个具体的内容)
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
\判断是否出现错误正常为0异常错误为非0 取值在1-127之间
$0:当前执行的进程/程序名(就是当前执行的命令或程序的名字)
!$ : 表示上一个命令的最后一个参数


22.Linux 中shell脚本 、sed和awk命令_第8张图片

22.Linux 中shell脚本 、sed和awk命令_第9张图片

sed和awk

sed

stream editor 流编辑器
sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。

Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作; 非交互式编译文件

语法:

sed [options] ‘[command]’ [filename]
options:
-n 抑制自动(默认的) 输出(全部打印) 读取下一个输入行, -n 要读取的行号
-e 执行多个sed指令
-f 运行脚本
-i 编辑文件内容
-i.bak 编辑的同时创造.bak的备份
-r 使用扩展的正则表达式
command:
a 在匹配后追加
i 在匹配后插入
p 打印
d 删除
r/R 读取文件/一行
w 另存
s 查找
c 替换

#1.显示文件第三行
[root@JhouShuai ~]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@JhouShuai ~]# head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@JhouShuai ~]# 

#2.显示文件前三行
[root@JhouShuai ~]# head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@JhouShuai ~]# sed -n '1,3p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@JhouShuai ~]# 

#3.显示文件除前三行之外的全部内容
[root@JhouShuai ~]# sed -n '1,3!p' /etc/passwd

#4.显示文件第三行和之后的三行
[root@JhouShuai ~]# sed -n '3,+3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@JhouShuai ~]# head -n 6 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@JhouShuai ~]# 

awk

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:Alfred Aho Peter Weinberger和brian kernighan三个人的姓的缩写。
最简单地说, AWK 是一种用于处理文本的编程语言工具。
任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。

特殊字段:
BEGIN语句设置计数和打印头部信息,在任何动作之前进行。
END语句输出统计结果,在完成动作之后执行。

分隔符默认是空格,可以用-F, 改变成逗号为分隔符 -F, 或改成冒号 -F:

#显示所有内容:
[root@JhouShuai ~]# awk '{print $0}' a.txt 
kkk kkkkk kkkkk
ddd ddddd ddddd
ccc ccccc cccc
ddd ddddf sdfsdf

#显示第一列内容:
[root@JhouShuai ~]# awk '{print $1}' a.txt 
kkk
ddd
ccc
ddd
[root@JhouShuai ~]# 

#显示第一列,以:作为分隔符
[root@JhouShuai ~]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games

#显示第一列和第三列的内容
[root@JhouShuai ~]# awk '{print $1,$3}' a.txt 
kkk kkkkk
ddd ddddd
ccc cccc
ddd sdfsdf
[root@JhouShuai ~]# 


#打印一个文件头,打印一个文件尾
#特殊字段:
#BEGIN语句设置计数和打印头部信息,在任何动作之前进行。
#END语句输出统计结果,在完成动作之后执行
[root@JhouShuai ~]# awk 'BEGIN {print "name address email\n"}{print $1,$2,$3}END{print "End OF Personal Info"}' a.txt 
name address email

kkk kkkkk kkkkk
ddd ddddd ddddd
ccc ccccc cccc
ddd ddddf sdfsdf
End OF Personal Info
[root@JhouShuai ~]# 


你可能感兴趣的:(22.Linux 中shell脚本 、sed和awk命令)