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

               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

 

 

 

 

 

 

 

 

你可能感兴趣的:(shell,正则表达式,redhat,脚本,测试,action)