shell基本语法
作业一:整理博客,内容包含awk、变量、运算符、if多分支
一、AWK
语法
awk [options] 'commands' files option -F 定义字段分隔符,默认的分隔符是连续的空格或制表符 使用option中的-F参数定义间隔符号 用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域 NF变量表示当前记录的字段数 -v定义变量并赋值 也可以借用次方式从shell变量中引入
command处理
1.读前处理 BEGIN{awk_cmd1;awk_cmd2}
2.行处理:定址 命令
定址方法:正则,变量,比较和关系运算
正则需要用//包围起来
^行首
$行尾
.除了换行符以外的任意单个字符
*前导字符的零个或多个
.*所有字符
[]字符组内的任一字符
[^]对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^]非字符组内的字符开头的行
[a-z]小写字母
[A-Z]大写字母
[a-Z]小写和大写字母
[0-9]数字
\<单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\>单词尾
扩展正则 加 -r 参数 或转义
sed -n '/roo\?/p' /etc/passwd sed -rn '/roo?/p' /etc/passwd
? 前导字符零个或一个
+ 前导字符一个或多个
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出现m次
x\{m,\} x出现m次至多次(至少m次)
x\{m,n\} x出现m次至n次
NR变量定址
NR 表示AWK读入的行数
FNR表示读入行所在文件中的行数
# awk '{print NR,FNR,$1}' file1 file2
1 1 aaaaa
2 2 bbbbb
3 3 ccccc
4 1 dddddd
5 2 eeeeee
6 3 ffffff
逻辑运算 可直接引用域进行运算
== >= <= != > < ~ !~
# awk 'NR==1 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#
3.命令 {print $0}
4.读后处理 END {awk_cmd1;awk_cmd2;}
AWK变量
NR 当前记录的个数(全部文件连接后的统计)
FNR 当前记录的个数(仅为当前文件的统计,非全部)
FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
OFS 输出字符的分隔符 默认是空格
# awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
root=====x
NF 当前读入行的字段个数
ORS 输出记录分隔符 默认是换行
# awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
root x=====bin x=====
FILENAME 当前文件名
引用shell变量的方法
# a=root
# awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
或者 把整个命令拆开传递,让shell变量外露,
# awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
# a=NF
# awk -F: '{print $'$a'}' /etc/passwd
操作符
赋值
= += -= /= *= 逻辑与 逻辑或 逻辑非 && || ! 匹配正则或不匹配,正则需要用 /正则/ 包围住 ~ !~ 关系 比较字符串时要把字符串用双引号引起来 < <= > >= != == 字段引用 $ 字段引用需要加$,而变量引用直接用变量名取 运算符 + - * / % ++ -- 转义序列 \\ \自身 \$ 转义$ \t 制表符 \b 退格符 \r 回车符 \n 换行符 \c 取消换行
作业二:awk文本处理
1、打印uid在30~40范围内的用户名
[root@nfs-server ~]# awk -F: '$3>=30 && $3<=40{print $1}' /etc/passwd
rpc
ntp
2、打印第5-10行的行号和用户名
[root@nfs-server ~]# awk -F: 'NR>=5 && NR<=10{print NR,"-------",$1}' /etc/passwd
5 ------- lp
6 ------- sync
7 ------- shutdown
8 ------- halt
9 ------- mail
10 ------- operator
3、打印奇数行
[root@nfs-server ~]# awk '(NR%2){print NR,"----",$0}' test
1 ---- root:x:0:0:root:/root:/bin/bash
3 ---- nginx:x:991:547:Nginx web server:/var/lib/nginx:/sbin/nologin
5 ---- abominate:x:1010:1011::/home/abominate:/bin/bash
7 ---- atomize:x:1012:1013::/home/atomize:/bin/bash
9 ---- Wpq2222b:x:1014:1015::/home/Wpq2222b:/bin/bash
11 ---- egon666:x:1016:1017::/home/egon666:/bin/bash
[root@nfs-server ~]#
4、打印偶数行
[root@nfs-server ~]# awk '!(NR%2){print NR,"----",$0}' test
2 ---- bin:x:1:1:bin:/bin:/sbin/nologin
4 ---- abominable:x:1009:1010::/home/abominable:/bin/bash
6 ---- anomie:x:1011:1012::/home/anomie:/bin/bash
8 ---- Alex213sb:x:1013:1014::/home/Alex213sb:/bin/bash
10 ---- yH438PIG:x:1015:1016::/home/yH438PIG:/bin/bash
12 ---- egon:x:1017:1002::/home/egon:/bin/bash
5、打印字段数大于5的行
[root@nfs-server ~]# awk -F: 'NF>5{print $1,"-----",NF}' test
root ----- 7
bin ----- 7
nginx ----- 7
abominable ----- 7
abominate ----- 7
anomie ----- 7
atomize ----- 7
Alex213sb ----- 7
Wpq2222b ----- 7
yH438PIG ----- 7
egon666 ----- 7
egon ----- 7
6、打印UID不等于GID的用户名
[root@nfs-server ~]# awk -F: '$3!=$4{print $3,"----",$4}' test
991 ---- 547
1009 ---- 1010
1010 ---- 1011
1011 ---- 1012
1012 ---- 1013
1013 ---- 1014
1014 ---- 1015
1015 ---- 1016
1016 ---- 1017
1017 ---- 1002
7、打印没有指定shell的用户
[root@nfs-server ~]# awk -F: '$NF!~/bash$/{print $0}' test
bin:x:1:1:bin:/bin:/sbin/nologin
nginx:x:991:547:Nginx web server:/var/lib/nginx:/sbin/nologin
作业三:shell脚本编写
1、自动部署、初始配置、并启动nginx反向代理服务
#!/bin/sh
ngxStatus=`ps aux | grep -v grep |grep -c nginx`
if [ -e /usr/sbin/nginx ];then
echo "nginx already installed"
exit 110
else
yum install epel-release -y -q
yum install gcc-* glibc-* openssl openssl-devel pcre pcre-devel zlib zlib-devel -y -q
yum install nginx -y -q
echo "install nginx successful"
fi
if [ -f /etc/nginx/nginx.conf ];then
/bin/cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
sed -i '/^http/a\\t upstream luchuangao { \n\t server web01;\n\t server web02;\n\t server web03;\n\t }' /etc/nginx/nginx.conf
sed -i '/^ location \/ {/a\\t\t proxy_pass http:\/\/luchuangao;' /etc/nginx/nginx.conf
echo "Configuration successful"
fi
if [ $ngxStatus -lt 2 ];then
systemctl start nginx
echo "Start nginx successful"
fi
2、自动部署、初始配置、并启动三台web
#!/bin/sh
ngxStatus=`ps aux | grep -v grep |grep -c nginx`
if [ -e /usr/sbin/nginx ];then
echo "nginx already installed"
exit 110
else
yum install epel-release -y -q
yum install gcc-* glibc-* openssl openssl-devel pcre pcre-devel zlib zlib-devel -y -q
yum install nginx -y -q
echo "install nginx successful"
fi
if [ -f /etc/nginx/nginx.conf ];then
/bin/cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
sed -i '/^ location \/ {/a\\t\t root /data/www/html;\n\t\t index index.html;' /etc/nginx/nginx.conf
mkdir -p /data/www/html
echo `hostname` > /data/www/html/index.html
echo "Configuration successful"
fi
if [ $ngxStatus -lt 2 ];then
systemctl start nginx
echo "Start nginx successful"
fi
3、监控脚本:监控每台机器的内存使用率>70%,则输出报警信息
#!/bin/sh
mem_use=`free | awk 'NR==2{print $3}'`
mem_total=`free | awk 'NR==2{print $2}'`
mem_per=`echo "scale=2;$mem_use/$mem_total"|bc -l |cut -d . -f2`
if [ -e /usr/bin/bc ];then
echo "bc already installed"
else
yum install bc -y -q
echo "bc nginx successful"
fi
#if [ $mem_per -gt 70 ];then
if (( $mem_per > 70 )); then
echo "Warning free has not enough, now free is ${mem_per}%"
else
echo "Now free is ${mem_per}%"
fi
参考链接:http://www.cnblogs.com/linhaifeng/p/6596660.html
参考链接:http://www.cnblogs.com/linhaifeng/p/6602149.html

浙公网安备 33010602011771号