您的位置:首页 > 运维架构 > Shell

shell脚本学习:循序渐进之初级awk语句,until循环,test语句

2011-07-25 23:37 786 查看
awk起源:awk语句是70年代由BELL实验室三个研究人员开发出来的一套语言,awk的名字就是这三位研究人员的名字头字母。但是最初的awk并不是面向用户使用,而是商业化,面向个人使用,但awk依然是一套强大的语言。
90年代,GNU在awk基础上开发出完全开源版本,功能更加强大强大,甚至可以通过ftp来网络应用
awk语句是一种非常强大的语句,它的功能异常强大,甚至可以当作一门编程语言来使用,在以后会经常用到awk语句来处理字符。在shell脚本里,awk可以说是核心之一,因为刚接触awk语句,所以,先写下这篇初级awk语句的学习感受。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
awk使用格式:
awk [option] 'pattern {action}'
pattern : /regexp/ //正则表达式
exp //表达式
BEGIN
END
action : print //对文本切片,$1,....,$N
FS: //读入文件是以什么作为分割符,默认空格符
RS: // 换行符, /n
OFS //输出的段分隔符
ORS //输出的行一行间隔符
NF //一个行里切开有多少个断
NR //行号当前在第几个行
awk -F: //可以指定输入的时候分割符是“:”,也可以指定别的

举两个例子来显示awk语句的强大:
1.显示当前系统上所有其VSZ段的值大于4000的进程的进程名字、进程号和VSZ值的大小;
ps aux |awk '$5>4000 {print $2 "\t" $5 "\t" $11}' |grep -v "PID"
##将ps 进程信息交给awk命令来处理,默认以空格来作为分隔符,如果第5个字段的值大于4000,就显示第2 , 3,5个字段,并且交给grep来处理,打印出没有"PID"的项。
看到了吗,这条awk语句的pattern项,为一个表达式:$5>4000, 在awk里,pttern可是是正则表达式,表达式,用好这个条件,可以快速匹配出想要得到的文本,而不需要用grep或##者sed去抓取命令。而后面的$2,$5指的是第2,5个字段,\t是制表符。

2.显示linuxer1-linuxer20每个用户名及对应的UID号码和GID号码
##做这个练习前需先建立用户linuxer1-linuxer20
grep "linuxer$I" $FILE | awk 'BEGIN{FS=":"}{print $1",UID:" $3",GID:"$4}'
#BEGIN的用法:BEGIN{} {}指,在后面的命令执行前,先准备好BEGIN{}里的内容,即先执行BEGIN里的内容,后执行action,而END则恰好相反
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

until循环:until循环和while循环有一定的区别如下:
until CONDITION ; do
...
...
done
#当CONDITION为假时,进行循环,直到为真,这样就可以指定一个条件,如果符合这个条件则,一直循环下去,直到不符合这个条件为止。

写一个脚本:
查看redhat用户是否登录了系统,如果登录了,就通知当前脚本执行者“redhat is logged on.”;
否则,就睡眠5秒钟后再次进行测试;直到其登录为止退出;
要求:使用until循环
#sleep 5 睡眠5秒
#wall " " 向所有人通告“ ”
#!/bin/bash
#
who | grep "redhat" &> /dev/null          //抓取当前登录用户里,是否有redhat
WHO=$?                                                //上一条语句执行是否成功,成功WHO为0
until [ $WHO -eq 0 ];do                          //除非变量WHO的值为0,否则一直执行循环体
   sleep 5                                                 
   who | grep "redhat" &> /dev/null           
   WHO=$?                                        //再次测试,防止死循环
done                                                       
wall "redhat is logged on"


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test语句
脚本条件判断
test express
test 语句重要用于程序执行流或者其他可以附加条件的语句,成为他们的 condition, 这样丰富了脚本的灵活度。
它的格式:
[ expression ] //必须有空格,复制语法错误
[[ expression ]]
条件测试:
整数测试
-lt, [ $A -lt $B ] //A是否小于B
-le 小于或等于
-gt 大于
-ge 大于或等于
-nq 等于
-ne 不等于
字符串测试
== //等号左右要有空格 'w' 字符串用单引号,变量用“” == 两边有空格
!=
>
<
-z //判断一个字符串是否为空 空为真,不空位假 [ -z $A]
-n //与-z相反
文件测试
-e FILE //判断一个文件是否存在
-f //是否是普通文件
-d //是否是目录
-h/-L //判断是否是符号链接文件或软连接
-r //是否可读 当前用户
-w 可写 对当前用户
-x 执行 对当前用户来讲是否有可执行
-s //存在且大小不为0
-O //判断脚本的发起者是不是文件的属主
-G //是不是有效属组

例如上面例子里的until [ $WHO -eq 0 ]; -eq来测试是否等于0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: