Shell脚本之awk文本编辑器语法(二) ---------------------------------- 流程控制 分支结构 (一) if (条件) 动做 if (条件) {动做1;动做2} 如: # awk -F: '{if ($1 == "root")print $1}' /etc/passwd awk -F: '{if ($1 == "root"){print $1;print $7}}' /etc/passwd (二) if (条件1) 动做1 else 动做2 如: # awk -F: '{if ($1 == "root") print $1; else print $6}' testfile # awk -F: '{if ($1 == "root") {print $1} else print $6}' testfile 上面两个命令是等价的,要么用分号隔开,表示第一个动做体的结束,要么将动做体用大括号定位范围 (三)if (条件1) 动做1 else if (条件2) 动做2 else if (条件2) 动做3 else 动做4 如: # awk -F: '{if ($1=="root")print $1;else if($1=="bin")print $3;else if($1=="myuser")print $7}' testfile (四) 条件 ? 动做1:动做2 expr ? action1:action2 如: # awk -F: 'AA=($3>=500?$3:"system_user"){print $1"\t"$3"\t"AA}' testfile root 0 system_user bin 1 system_user myuser 501 501 ---------------------------------------------------------- 读前处理和读后处理 如: # awk 'BEGIN{i=1} {i++} END{print i}' /etc/passwd # awk -F: 'BEGIN{print NR,NF} END{print NR,NF}' /etc/passwd 0 0 46 7 # awk -F: 'BEGIN{sum=0} {sum=sum+NF}END{print sum}' /etc/passwd 322 # awk -F: 'BEGIN{sum=0} {sum+=NF}END{print sum}' /etc/passwd 322 BEGIN块能够独立使用,不须要引入文件 # awk 'BEGIN{i=1;while(i<10) {print i;i++}}' 1 2 3 4 5 6 7 8 9 ------------------------------------------------------------- 循环语句 (一) while (条件) { 动做 条件运算 } 如: # awk -F: '{while($3<3) {print $3,$1;$3++}}' /etc/passwd 0 root 1 root 2 root 1 bin 2 bin 2 daemon (二) do { 动做 条件运算 } while (条件) 如: # awk 'BEGIN{i=5;do{print i;i++}while(i<10)}' 5 6 7 8 9 (三)for (预置;条件;递增) { 动做 } 如: # awk 'BEGIN{for (i=1;i<5;i++) print i}' 1 2 3 4 (四) 循环for嵌套 如: # awk 'BEGIN{for (i=1;i<3;i++) {for (j=1;j<=3;j++) print i,j}}' 1 1 1 2 1 3 2 1 2 2 2 3 # awk 'BEGIN{OFS="";for (i=1;i<=9;i++) {for (j=0;j<=9;j++) {for (n=0;n<=9;n++) print i,j,n}}}' 使用嵌套的for循环,打印100-999之间的数 # awk -F: '{for(x=NF;x>0;x--)print $x}' testfile 逆序输出 ------------------------------------------------------------ 输出样式 # awk -F: '{printf "%-10s %-7d %s\n",$1,$3,$7}' testfile root 0 /bin/bash bin 1 /sbin/nologin myuser 501 /bin/bash 命令分析: %s是字符类型,%d数值类型 printf默认是不输出换行的因此要加\n(printf和print不一样,print默认每输出一行进行换行) 10和7是偏移量 默认是右对齐,全部加个- 就是左对齐,就是把不足的位数用空格填充 注意:格式与输出列之间要有逗号 --------------------------------------- 跳转语句 break 跳出循环 # awk 'BEGIN {for(x=1;x<5;x++) {if (x==3) break;print x }}' 1 2 continue 在达到循环底部以前终止当前循环 重新开始下一次循环 # awk 'BEGIN {for(x=1;x<5;x++) {if (x==3) continue;print x }}' 1 2 4 next 读入下一行 同时返回脚本顶部 这样能够避免对当前行执行其余操做 # awk -F: 'NR > 5 {next} {print $1} END {print NR}' /etc/passwd root bin daemon adm lp 46 exit 使读取动做终止 并将控制移动到END,若是没有END则终止脚本 # awk -F: 'NR > 5 {exit} {print $1} END {print NR}' /etc/passwd root bin daemon adm lp 6 -------------------------------------------------------------------- 函数 转换函数,转换成整数 如: # awk 'BEGIN{print int(3.934)}' 3 随机数函数 rand() srand() rand() 取值 0 > r > 1 之间 默认的种子是系统时间 精确到秒 srand()取值 0 > r > 1 之间 能够指定种子来影响rand()取值数 默认是系统时间 精确到秒 echo $RANDOM 如: # awk 'BEGIN{print int(rand()*100)}' 23 # awk 'BEGIN{srand(123);print int(rand()*100)}' 74 # awk -v a=$RANDOM 'BEGIN{print a}' 22059 字符串函数 substr(s,x,y) 返回字符串s中从位置x起至y的子串,若是没有给出y,则从x开始到结束 如: # awk 'BEGIN{aa="abcdefghi";print substr(aa,3,4)}' cdef # awk 'BEGIN{aa="abcdefghi";print substr(aa,1)}' abcdefghi 大写小写函数 tolower() 小写函数 toupper() 大写函数 sprintf() 自己并不能打印,作格式转换,将数字转换成ASCII字符 # awk 'BEGIN{for(i=97;i<=122;++i)print toupper(sprintf("%c",i))}' # awk 'BEGIN{for(i=97;i<=122;++i)print tolower(sprintf("%c",i))}' 字符串长度 length() 若是没有给定字符串则使用$0 # awk 'BEGIN{print length("abcdefghi")}' 9 # awk '{print length()}' /etc/passwd gsub(/abc/,"ABC",x) 全局字符串替换,从x中用匹配的abc正则替换成ABC # awk 'BEGIN{aa="abcxyzabcxyzabc";gsub(/abc/,"ABC",aa);print aa}' ABCxyzABCxyzABC 系统交互输入函数——getline (等同于shell中的read -p "strings" var ) 如: # awk -F: 'BEGIN{printf "sss: ";getline;for(i=1;i<=$0;i++) print i}' sss: 4 1 2 3 4 使用getline函数将输入值赋给变量 # awk -F: 'BEGIN{printf "haoren: ";getline NUM;for(i=1;i<=NUM;i++)print NUM,i}' haoren: 5 5 1 5 2 5 3 5 4 5 5 从文件中读入 #awk -F: 'BEGIN {while (getline < "/etc/passwd" > 0) print $3"\t"$1}' getline < "/etc/passwd" 从文件中读入,每次读取一行,默认状况下读取的次数等于awk自身引入文件的行数 > 0 测试读取的返回值,成功返回1,失败返回-1,0文件末尾 从命令输出中输入 [root@stu254 ~]# awk 'BEGIN {"uname -a"|getline ;print $3}' 2.6.18-53.el5 system(command)——引入系统命令,系统命令要用""引发来 如: # awk 'BEGIN{if(system("mkdir mulu1") != 0) print "error"}' # awk 'BEGIN{if(system("mkdir mulu1") != 0) print "error"}' mkdir: 没法建立目录"mulu1": 文件已存在 error awk脚本—— -f 脚本开头使用 #!/bin/awk -f 如:使用awk脚本添加用户 #!/bin/awk -f { system("useradd "$1";echo "$2"|passwd --stdin" $1) } # cat user.txt myuser222 123123 myuser333 456456 # ./useradd.awk user.txt 更改用户 myuser222 的密码 。 passwd: 全部的身份验证令牌已经成功更新。 更改用户 myuser333 的密码 。 passwd: 全部的身份验证令牌已经成功更新。