当前位置:  操作系统/服务器>linux
本页文章导读:
    ▪尚观linux笔记之awk初探      awk 用法:awk ' pattern {action} '    变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符,默认为一个空格 RS 输入记录.........
    ▪尚观linux笔记之awk与sed高级使用      代码如下:   代码示例: #!/bin/bash LOGPATH="/home/andyguo" LOGNAME="h_access.log" #恢复被封闭ip时间单位是秒 TIME=50 #被封ip记录的log位置 FILENAME="/home/andyguo/msgreporter.log" #过滤的内容 GR="GET /resume/sh.........
    ▪尚观linux笔记之awk基础与实例分享      一,编写awk 脚本   代码示例: HELLO,WORLD $echo 'this line of data is ignored' > test $ awk'{ print "Hello, world" }' test Hello,world 1,Awk读入一行,执行一次括号里面的动作   代码示例: $ cattest2 Hello,worl.........

[1]尚观linux笔记之awk初探
    来源: 互联网  发布时间: 2013-12-24

awk 用法:awk ' pattern {action} ' 
 

变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符

awk '/101/'file 显示文件file中包含101的匹配行。
awk '/101/,/105/' file
awk '$1 == 5' file
awk '$1 == "CT"'  file 注意必须带双引号
awk '$1 * $2 >100 'file 
awk '$2 >5 && $2<=15' file
awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。
awk '/101/ {print $1$2}'  file
awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
df | awk '$4>1000000 ' 通过管道符获得输入,如:显示第4个域满足条件的行。
awk -F "|" '{print $1}'file 按照新的分隔符“|”进行操作。
awk  'BEGIN { FS="[: \t|]" }
{print $1,$2,$3}' file 通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。

Sep="|"
awk -F $Sep '{print $1}'  file 按照环境变量Sep的值做为分隔符。
awk -F '[ :\t|]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。
awk -F '[][]''{print $1}' file 按照正则表达式的值做为分隔符,这里代表[、]
awk -f awkfile file 通过文件awkfile的内容依次进行控制。
cat awkfile
/101/{print "\047 Hello! \047"} --遇到匹配行以后打印 ' Hello! '.\047代表单引号。
{print $1,$2}--因为没有模式控制,打印每一行的前两个域。
awk '$1 ~ /101/ {print $1}' file 显示文件中第一个域匹配101的行(记录)。
awk'BEGIN { OFS="%"}
{print $1,$2}'file 通过设置输出分隔符(OFS="%")修改输出格式。
awk'BEGIN { max=100 ;print "max=" max} BEGIN 表示在处理任意行之前进行的操作。
{max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一个域的最大值。
 

(表达式1?表达式2:表达式3 相当于:
if (表达式1)
表达式2
else
表达式3
 

代码示例:
awk '{print ($1>4 ? "high "$1: "low "$1)}' file 
awk '$1 * $2 >100 {print $1}' file 显示文件中第一个域匹配101的行(记录)。
awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)。
awk '{$7 %= 3; print $7}'  file 将第7域被3除,并将余数赋给第7域再打印。
awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行后为变量wage赋值并打印该变量。
awk '/tom/ {count++;} 
END {print "tom was found "count" times"}' file END表示在所有输入行处理完后进行处理。
awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4;
 END {print "The total is $" cost>"filename"}'file gsub函数用空串替换$和,再将结果输出到filename中。

 1 2 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00
 

代码示例:
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>1000&&$4<2000) c1+=$4;
else if ($4>2000&&$4<3000) c2+=$4;
else if ($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file

通过if和else if完成条件语句
 

代码示例:
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000&&$4<4000) exit;
else c4+=$4; }
END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file

通过exit在某条件时退出,但是仍执行END操作。
 

代码示例:
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000) next;
else c4+=$4; }
END {printf  "c4=[%d]\n",c4}"' file

通过next在某条件时跳过该行,对下一行执行操作。
 

代码示例:
awk '{ print FILENAME,$0 }' file1 file2 file3>fileall

把file1、file2、file3的文件内容全部写到fileall中,格式为打印文件并前置文件名。
 

代码示例:
awk ' $1!=previous { close(previous); previous=$1 }
{print substr($0,index($0," ") +1)>$1}' fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。
awk 'BEGIN {"date"|getline d; print d}' 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。 
awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}'

通过getline命令交互输入name,并显示出来。
 

代码示例:
awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}'

打印/etc/passwd文件中用户名包含050x_的用户名。
 

代码示例:
awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环。
awk '{ for(i=1;i<NF;i++) {print NF,$i}}'file 通过for语句实现循环。
type file|awk -F "/" '
{ for(i=1;i<NF;i++)
{ if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i } }}' 显示一个文件的全路径。

 用for和if显示日期。
 

代码示例:
awk  'BEGIN {
for(j=1;j<=12;j++)
{ flag=0;
  printf "\n%d月份\n",j;
for(i=1;i<=31;i++)
{
if (j==2&&i>28) flag=1;
if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0) {printf "%02d%02d ",j,i}
}
}
}'

在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串,如下:
 

代码示例:
Flag=abcd
awk '{print '$Flag'}'结果为abcd
awk '{print  "$Flag"}'结果为$Flag

    
[2]尚观linux笔记之awk与sed高级使用
    来源: 互联网  发布时间: 2013-12-24

代码如下:
 

代码示例:

#!/bin/bash
LOGPATH="/home/andyguo"
LOGNAME="h_access.log"
#恢复被封闭ip时间单位是秒
TIME=50
#被封ip记录的log位置
FILENAME="/home/andyguo/msgreporter.log"
#过滤的内容
GR="GET /resume/showresumedetail"
#过滤内部特殊ip
gre_ip='27.115.103.179|58.246.147.*'
#---报警阀值设置#---##
typeset -i H #将其设置成数字类型便于比较大小
H=10#`date '+%H'`
echo  "当前时间"$H
#早上8点到下午16点为高峰时段
if([ $H -ge 8 -a $H -le 18 ])
then
   echo "高峰时段"
    N=1 #短信报警阀值
    FN=100 #封ip的阀值
    RN=1 #扫描简历报警阀值
#下午18点到23点为普通访问时段
elif([ $H -gt 18 -a $H -le 23 ])
then
  echo "普通访问时段"
    N=1 #短信报警阀值
    FN=1 #封ip的阀值
    RN=1 #扫描简历报警阀值
#其他时段
else
   echo "低谷时段"
   N=9 #短信报警阀值
   FN=1 #封iP的阀值
   RN=1 #扫描简历报警阀值
fi
echo "报警阀值" $N
echo "封ip阀值" $FN
echo "扫描简历阀值" $RN
#时间段截取
Y=`date '+%Y:'`
STARTTIME=$Y` date -d   ' minutes' |awk '{print $4}'`
ENDTIME=$Y`date -d ' -9 minutes'|awk '{print $4}'`
STARTTIME="2012:16:04:33"
ENDTIME="2012:16:00:33"
echo "开始时间:" $STARTTIME
echo "结束时间:"$ENDTIME

cd $LOGPATH

MSG="$LOGNAME: "
BOOL=0 #判断是否发短信

for ((i=1;i<=3;i++)) 
   do
msg=`cat $LOGNAME |awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME  '{if ($3>=date2 && $3<=date1) print}'|awk '{print $1}'|grep -v -|egrep -v $gre_ip |sort|uniq -c|sort -nr|sed -n ${i}p |awk -v n=$N '{if ($1>n) print "ip="$2"("$1")"}'`
        if [ -n "$msg" ];then
           BOOL=1
        fi
       MSG=$MSG$msg" "   
  done
echo "普通报警: " $MSG
echo "普通报警:"$MSG  >>/var/log/$LOGNAME

if [ $BOOL == 1 ];then
  for phone_num in   13810697234
  #for phone_num in 13810697234
  do
   echo "发短信"
    # wget -O /dev/null "http://127.0.0.1/sms/send?view_id=0&client_id=1004&data=[{%22tel%22:%22$phone_num%22,%22context%22:%22$SEND_MSG.[testcom]%22,%22kind%22:%2206%22}]"
   done
fi
#---
SEND_MSG="$LOGNAME "
SEND_BOOL=0
for ((i=1;i<=3;i++))
do
      send_msg=`cat $LOGNAME |grep "$GR"|awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME  '{if ($3>=date2 && $3<=date1) print}'|awk '{print $1}'|grep -v -|egrep -v $gre_ip|sort|uniq -c|sort -nr|sed -n ${i}p |awk -v n=$RN '{if ($1>n) print "ip="$2"("$1")"}'`
      if [ -n "$send_msg" ];then
          SEND_BOOL=1
       fi
      ip=`echo $send_msg |awk -F "(" '{print $1}'|awk -F "=" '{print $2}'`
      userid_nu=`cat $LOGNAME |awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME  '{if ($3>=date2 && $3<=date1) print}'|grep "$ip"|grep "$GR"|awk -F '\t' '{print $11}'|grep -v "0"|sort|uniq -c|wc -l`
      SEND_MSG=$SEND_MSG$send_msg"(""$userid_nu"")"
done

echo "抓简历报警: "$SEND_MSG
echo "抓简历报警:"$SEND_MSG  >>/var/log/$LOGNAME
if [ $SEND_BOOL == 1 ];then
  for phone_num in   13810697234
  #for phone_num in 13810697234
  do
   echo "发短信"
   #   wget -O /dev/null "http://127.0.0.1/sms/send?view_id=0&client_id=1004&data=[{%22tel%22:%22$phone_num%22,%22context%22:%22$SEND_MSG.[testcom]%22,%22kind%22:%2206%22}]"
   done
fi

#---
#被封闭ip地址和时间记录的文件名称和地址

#现在时间
now=`date "+%Y-%m-%d %H:%M:%S"`
echo  "封ip的时间:" $now
IPTABLES_MSG="$LOGNAME: "" unable visit ip "
IPTABLES_BOOL=0

for((i=1;i<=3;i++))
do
      iptables_msg=`cat $LOGNAME |awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME  '{if ($3>=date2 && $3<=date1) print}'|awk '{print $1}'|grep -v -|egrep -v $gre_ip|sort|uniq -c|sort -nr|sed -n ${i}p |awk -v n=$FN '{if ($1>n) print $2"("$1")"}'`
     if [ -n "$iptables_msg" ];then
          ip=`echo $iptables_msg|awk -F "(" '{print $1}'`
              IPTABLES_BOOL=1
              echo "封闭ip和时间"${ip}";"${now}
              echo ${ip}";"${now}>> $FILENAME
              echo "封闭IP:"$ip
              `/sbin/iptables -I INPUT -s ${ip} -p tcp --dport 80 -j DROP`
     fi

     IPTABLES_MSG=$IPTABLES_MSG$iptables_msg" "
done
echo $IPTABLES_MSG
echo $IPTABLES_MSG  >>/var/log/$LOGNAME
if [ $IPTABLES_BOOL == 1 ];then
  for phone_num in  13810697234
  #for phone_num in 13810697234
  do
    echo "发短信"
  #   wget -O /dev/null "http://127.0.0.1/sms/send?view_id=0&client_id=1004&data=[{%22tel%22:%22$phone_num%22,%22context%22:%22$SEND_MSG.[testcom]%22,%22kind%22:%2206%22}]"   done
fi

#---
#计算时间差
typeset -i result
#现在时间
now=`date "+%Y-%m-%d %H:%M:%S"`
echo  "解封ip时间:" $now
end=`date +%s -d "$now"
while read LINE
do
startime=`echo $LINE |awk  -F ";" '{print $2}'`
star=`date +%s -d "$startime"`
result=$(($end-$star))
if([ $result -ge $TIME ]);then
       ip=`echo $LINE |awk  -F ";" '{print $1}'`
            echo "封闭ip离现在已经"$result"秒"
            echo "清除ip"$ip
            `/sbin/iptables -D INPUT -s $ip -p tcp --dport 80 -j DROP`
             sed -i -e "/$LINE/d" $FILENAME
             echo $LINE
       fi
done < $FILENAME

附,grep和egrep的用法。
1,格式: grep [option] pattern filename 注意: pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.
 

代码示例:
grep '\<Tom\>' file   包含单词Tom的行
grep 'Tom savage' file 包含Tom savage的行
grep '^Tommy' file 包含以Tommy开头的行
grep '\.bak$' file 包含以.bak结束的行
grep '[Pp]yramid' file 包含pyramid 或Pyramid的单词的行
grep '[A-Z]' file 包含至少一个大写字母的行
grep '[0-9]' file 包含至少一个数字的行
grep '[A-Z]...[0-9]' file 包含五个字符,以大写开头, 和一个数字结尾的行.
grep -w '[tT]est' file 包含单词和test的行.
grep -s 'ken sun' file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
grep -v aaa file 打印不包含aaa的行.
grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
grep -l 'dear cathy' * 打印包含dear cathy的文件的文件名清单.
grep -n tom file   打印匹配的行并追加行号.
grep "$LOGNAME" file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
grep '$name' file 打印包含字符$name的行.

2,egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式. 注意区别.
扩展表达式:
 

代码示例:

+ 匹配一个或者多个先前的字符, 至少一个先前字符.
? 匹配0个或者多个先前字符.
a|b|c 匹配a或b或c
() 字符组, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
x{m,n} =x\{m,n\} x的字符数量在m到n个之间.

egrep '^+' file   以一个或者多个空格开头的行.
grep '^*' file   同上
egrep '(TOM|DAN) SAVAGE' file 包含 TOM SAVAGE 和DAN SAVAGE的行.
egrep '(ab)+' file 包含至少一个ab的行.
egrep 'x[0-9]?' file 包含x或者x后面跟着0个或者多个数字的行.
egrep 'fun\.$' * 所有文件里面以fun.结尾的行.
egrep '[A-Z]+' file 至少包含一个大写字母的行.
egrep '[0-9]' file 至少一个数字的行.
egrep '[A-Z]...[0-9]' file 有五个字符, 第一个式大写, 最后一个是数字的行.
egrep '[tT]est' file 包含单词test或Test的行.
egrep 'ken sun' file 包含ken sun的行.
egrep -v 'marry' file 不包含marry的行.
egrep -i 'sam' file 不考虑sam的大小写,含有sam的行.
egrep -l "dear ken" * 包含dear ken的所有文件的清单.
egrep -n tom file 包含tom的行, 每行前面追加行号.
egrep -s "$name" file 找到变量名$name的, 不打印而是显示退出状态. 0表示找到. 1表示表达式没找到符合要求的, 2表示文件没找到。

3,fgrep 很简单就是固化表达式的搜索.如:
 

代码示例:
fgrep "$name...[a-z]" file 就是在file里面找到和字符$name...[a-z]一样的行. 其中$和...等没有转义的意义。

    
[3]尚观linux笔记之awk基础与实例分享
    来源: 互联网  发布时间: 2013-12-24

一,编写awk 脚本
 

代码示例:
HELLO,WORLD
$echo 'this line of data is ignored' > test
$ awk'{ print "Hello, world" }' test
Hello,world

1,Awk读入一行,执行一次括号里面的动作
 

代码示例:
$ cattest2
Hello,world
$ awk'{ print }' test2
Hello,world

2,print语句没有参数,只简单输出每个输入行。
 

代码示例:
$ awk‘BEGIN {print “hello,World”}’
Hello,World

BEGIN模式不需要等待输入,它在第一个输入行读入之前执行。
 
3,awk 程序设计模型
awk 程序由所谓的主输入(main input)循环组成。一个循环称作一个例程。
awk允许你编写两个特殊的例程,他们在任何输入被读取前和所有输入都被读
取后执行。他们是与BEGIN和END规则相关的过程。BEGIN和END过程是可
选的。
 
模式匹配 src1.awk
 

代码示例:
#test for integer, string or empty line.
/[0-9]+/{ print "That is an integer" }
/[A-Za-z]+/{ print "This is a string" }
/^$/{ print "This is a blank line." }

一个特殊的例子:
 

代码示例:
$ awk-f awksrc
4T
Thatis an integer
Thisis a string

一行可以匹配一条或多条规则
程序脚本的注释
# 以#号开始的一行
记录和字段
awk假设它的输入是有结构的,而不是一串无规则的字符。默认它将每个输入
行作为一条记录,而将由空格或制表符分隔的单词作为字段。连续的多个空格
和/或制表符被作为一个分隔符。
JohnRobinson 666-555-1111
字段的引用和分离
awk允许使用字段操作符$来指定字段。$后面可以跟着一个数字或者一个变量。
$1表示第一个字段,$2表示第二个字段,$0表示整个输入记录。
 

代码示例:
$ awk'{ print $2, $1, $3 }' names
RobinsonJohn 666-555-1111

可以使用计算值为整数的表达式来表示一个字段
 

代码示例:
$echo a b c d | awk 'BEGIN { one = 1; two = 2 }
>{ print $(one + two) }'
c

可以使用-F来改变字段分隔符
 

代码示例:
$ awk-F"\t" '{ print $2 }' names
666-555-1111
$ awk-F"\t+" '{ print $2 }' names
$ awk-F"[‘:\t]"'{ print $2 }' names

任何3个字符之一都可以被解释为字段分隔符
也可以在脚本中指定域分隔符,通过系统变量FS来改变
 

代码示例:
BEGIN{ FS = "," } # comma-delimited fields
{print $1 "-" $2 }
 

使用匹配规则
 

代码示例:
/MA/{ print $1 ", " $6 }

为了避免假警报,可以使用更精确的匹配
 

代码示例:
$5 ~/MA/ { print $1 ", " $6 }

还可以使用!来反转这个规则的意义
 

代码示例:
$5 !~/MA/ { print $1 ", " $6 }

表达式: 
常量
分成两种:字符串型和数字型
字符串型在表达式中必须用引号括起来
字符串中可以使用转义序列,常用的转义序列有:
\n 换行 \t 水平制表符 \r 回车
 
变量
x=1
x是变量的名字 =是一个赋值操作符 1是一个数字常量
注意: 变量区分大小写,所以x 和X(大写)表示不同的变量
变量名只能由数字字母下划线组成,而且不能以数字开头
变量使用不区分类型,使用前不必初始化
 

z ="Hello" 
z ="Hello" "World"
z =$1

以上几种都是合法的
 
常用算数操作符
+Addition
-Subtraction
*Multiplication
/Division
%Modulo
 
x=1
给x赋值
y=x+1
计算x的值,使它加1,并将结果赋给变量y。
printy
 
打印y的值。
我们可以将这3个语句减少为两个:
x=1
printx+1
7
常用赋值操作符
 

代码示例:
++Add 1 to variable.
--Subtract 1 from variable.
+=Assign result of addition.
-=Assign result of subtraction.
*=Assign result of multiplication.
/=Assign result of division.
%=Assign result of modulo.
^=Assign result of exponentiation.(取幂)

计算文件中空行的数目
 

代码示例:
#Count blank lines.
/^$/{
printx += 1
}
x=x+1x+=1 ++x x++

这几种有什么区别?
 

代码示例:
#Count blank lines.
/^$/{
++x
}
END {
printx
}

计算学生的平均成绩
 

代码示例:
mona70 77 85 83 70 89
john85 92 78 94 88 91
andrea89 90 85 94 90 95
jasper84 88 80 92 84 82
dunce64 80 60 60 61 62
ellis90 98 89 96 96 92
$ awk-f src2.awk grades
john87.4
andrea86
jasper85.6
src2.awk
#average five grades
{total = $2 + $3 + $4 + $5 + $6
avg =total / 5
print$1, avg }

也可以使用print $1, total / 5
 
系统变量
 

FS 定义字段分隔符,默认为一个空格
OFS 输出的字段分隔符,默认为一个空格
RS 记录分隔符,默认为一个换行符
ORS 输出的记录分隔符,默认为一个换行符
NR 行数
FNR行数,多文件操作时会重新排序
NF 输出当前输入记录的编号(字段的个数)
FILENAME文件名

例如:
 

代码示例:
$ awk–F: ‘OFS=”aaa”,ORS=”bbb” {print NR,FNR,NF,FILENAME}’
/etc/passwda.txt
$print NR “.”,$1, avg
1.john 87.4
2.andrea 86
3.jasper 85.6

处理多行记录
JohnRobinson
KorenInc.
978Commonwealth Ave.
Boston
MA01760
696-0987
 

代码示例:
#block.awk - print first and last fields
# $1 =name; $NF = phone number
BEGIN{ FS = "\n"; RS = " " }
{print $1, $NF }
$ awk-f block.awk phones.block
JohnRobinson 696-0987
PhyllisChapman 879-0900
JeffreyWillis 914-636-0000
AliceGold (707) 724-0000
BillGold 1-707-724-0000

关系操作符和布尔操作符
 
关系操作符: 
 

<Less than
>Greater than
<=Less than or equal to
>=Greater than or equal to
==Equal to
!=Not equal to
~Matches
!~Does not match

NF ==5 NF(每个输入记录的字段数)的值和5相比较,如果结果为真,那
么就进行相应的处理,否则不进行处理。
 

代码示例:
$5 ~/MA/ {print $1 “,”$6}

注意:关系操作符==和赋值操作符=是不同的
布尔操作符
 

||Logical OR
&&Logical AND
!Logical NOT
NF ==6 && NR > 1

字段的数量必须等于6并且记录的编号必须大于1。
 

NR>1 && NF >=2 || $1 ~ /\t/
(NR>1 && NF >=2 )|| $1 ~ /\t/
!(NR> 1 && NF > 3)

获取文件的信息: 
 

代码示例:
$ ls-l |awk -f src3.awk
BEGIN{ print "BYTES", "\t", "FILE" }
{
sum+= $5
++filenum
print$5, "\t", $8
}
END {print "Total: ", sum, "bytes (" filenum " files)"}

格式化打印
printf( format-expression [, arguments] )
cASCII 字符
d 十进制整数
f 浮点格式
s 字符串
x 无符号十六进制
 
常用举例:
语法 %-width.precision format-specifier
 

代码示例:
printf("%d \t %s \n ", $5 , $8 )
printf("|%10s|\n","hello") 右对齐
printf("|%-10s|\n","hello") 左对齐
printf("%*.*f\n",5, 3, myvar) 宽度5 精度3 打印myvar

向脚本传递参数
 

代码示例:
awk'script' var=value inputfile
$var=root
$ awk–F: -v a=$var ‘$1==a {print}’ /etc/passwd

二,条件、循环
条件语句
if ( expression )
action1
[else
action2]
 
例如:
if (x ) print x
如果x是零,则print语句将不执行。如果x是一个非零值,将打印x的值。
if (x == y ) print x
if (x ~ /[yY](es)?/ ) print x
如果操作是由多个语句组成,要用一个大括号将操作括起来
if ( expression ) {
statement1
statement2
}
其他的例子:
 

代码示例:
if (avg >= 65 )
grade= "Pass"
else
grade= "Fail"
if(avg >= 90) grade = "A"
elseif (avg >= 80) grade = "B"
elseif (avg >= 70) grade = "C"
elseif (avg >= 60) grade = "D"
 
else grade = "F"

这种能够连续条件只有当一个条件表达式计算结果为真时才停止求值,这时将
跳过其他的条件。如果没有一个条件表达式的计算结果为真,将执行最后的
else部分。
条件操作符
expr ? action1 : action2
例如:
grade= (avg >= 60) ? "Pass" : "Fail"
循环
while循环
while循环语法:
while(condition)
action
例如:
 

代码示例:
i = 1
while( i <= 4 ) {
print$i
++i
}

do 循环
do
action
while(condition)
例如:
 

代码示例:
BEGIN{
do {
++x
printx
}while ( x <= 4 )
}

for 循环
for (set_counter ; test_counter ; increment_counter )
action
例如:
 

代码示例:
从第一个字段到最后一个字段
for (i = 1; i <= NF; i++ )
print$i
从最后一个字段到第一个字段
for (i = NF; i >= 1; i-- )
 
print$i

用for实现
 

代码示例:
total= 0
for(i = 2; i <= NF; ++i)
#total= $2 + $3 + $4 + $5 + $6
#avg= total / 5
total+= $i
avg =total / (NF - 1)

求阶乘
 

代码示例:
5!=5*4*3*2*1
fact= number
for(x = number - 1 ; x > 1; x--)
fact*= x

完整脚本 factorial
影响流控制的其他语句

影响控制流
break退出循环
continue终止当前的循环,并从循环的顶部开始一个新的循环

影响主输入循环
next 读入下一行,并返回脚本的顶部
exit 使主输入循环退出并将控制转移到END


    
最新技术文章:
▪linux系统中的列出敏感用户的脚本代码
▪a10 config backup for aXAPI
▪一键备份gitolite服务器的Shell脚本
▪nagios 分发文件实现代码
▪阿里云云服务器Linux系统更新yum源Shell脚本
▪一个监控LINUX目录和文件变化的Shell脚本分享
▪Linux下实现SSH免密码登录和实现秘钥的管理、...
▪Shell正则表达式之grep、sed、awk实操笔记
▪3个备份系统文件并邮件发送的Shell脚本分享
▪CentOS 6.3下给PHP添加mssql扩展模块教程
▪监控网站是否可以正常打开的Shell脚本分享
▪shell脚本编程之if语句学习笔记
▪shell脚本编程之循环语句学习笔记
▪shell脚本编程之case语句学习笔记
▪Shell脚本实现的阳历转农历代码分享
▪Shell脚本实现复制文件到多台服务器的代码分...
▪Shell脚本实现批量下载网络图片代码分享
▪Shell脚本实现检测文件是否被修改过代码分享
▪Shell脚本数组用法小结
▪Shell脚本批量重命名文件后缀的3种实现
▪C语言实现的ls命令源码分享
▪Linux下查找后门程序 CentOS 查后门程序的shell脚...
▪Shell 函数参数
▪linux shell 自定义函数方法(定义、返回值、变...
▪Shell实现判断进程是否存在并重新启动脚本分...
▪Shell脚本break和continue命令简明教程
▪Shell脚本函数定义和函数参数
▪让代码整洁、过程清晰的BASH Shell编程技巧 iis7站长之家
▪shell常用重定向实例讲解
▪awk中RS、ORS、FS、OFS的区别和联系小结
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3