Shell脚本之awk文本编辑器语法(二)

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: 全部的身份验证令牌已经成功更新。
相关文章
相关标签/搜索