设为首页 收藏本站
查看: 1254|回复: 6

SHELL之awk

[复制链接]

尚未签到

发表于 2013-4-27 14:02:06 | 显示全部楼层 |阅读模式
                awk  对文档实现复杂的操作,可以生成文本报告工具                                                                         
awk:提供的样式扫描与处理工具,非常擅长处理结构化数据和生成表单(格式化的报告生成工具)
  awk的命令格式:   awk   [options]    'PATTERN { action }'   file1,file2,...
                  关键字    选项         模式  动作         文件
  awk里面要执行的命令必须用单引号引着(即模式和动作必须用单引号引着)

  awk的选项:(最常见的)
    -v是指定变量(可以是awk的内置变量,也可以是自定义变量)
    -F指定字段分隔符
        eg:
         awk -F: '{ print $1,$2 }' /etc/passwd
             /etc/passwd 里面的文件内容本身就是以:进行分割的,所有在打印的时候需要用-F进行指定
     awk -v OFS=: '{print $1,$2}' 1.txt
             1.txt里面的文件内容用空格分割的,想让他输出显示用:进行分割,则必须用-v 内置变量进行以什么分割,OFS就是内置变量

  awk的模式:
     BEGIN/END
         eg:
            awk -F: 'BEGIN{print "Uname        Uid"}{printf "%-15s%s\n",$1,$3} END {print "end-over"}' /etc/passwd
             解释:单独在开始打印一句 Uname Uid,在末尾打印一句end-over
        awk 'BEGIN {print "a" "b"}'
              解释:打印ab字符串
            awk  'BEGIN{FS=":"}{print $1}' /etc/passwd
              解释:
    任意的正则表达式语句
           awk -F: '/bash/{print $1}' /etc/passwd
              解释:模式匹配为bash的就打印第一列 匹配的模式操作放在/ /之间
        表达式
        awk -F: '$3>=50{print $1,$3}' /etc/passwd
              解释:文件第三列与50比较,第三列大就打印第一列和第三列
        指定的范围  
  awk的动作:用{}括起来的语句都是awk的动作
         表达式
         控制语句(if-else,while,for,case,break和continue)
         eg:if-else
           awk -F: '{if($3==0)print $1,"Admin";else print $1,"Common User"}' /etc/passwd
              解释:判断文件中的第三列是否为0,是打印第一列然后加上Admin,不是打印第一列加上Common User
         eg:while
            格式:while (条件) {语句1;语句2;...}
            awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd
                   解释:
        eg:do-while(循环至少执行一次)
             格式:do(语句1;语句2;...)while(条件)
           awk -F: '{i=1;do {print $i;i++} while (i<=3)}'  /etc/passwd
               解释:
        eg:for
             awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
     命令
         函数调用
         
         awk使用数组
        [iyunv@localhost ~]# awk 'BEGIN {Arry["m"]="hello";Arry["n"]="world";print Arry["m"],Arry["n"]}'
     hello world
         
重点难点:         awk中for循环遍历数组的每一个元素
         for (flag in Arry) {print Arry[flag]}
     flag是数组下标,Arry是数组名       
     eg:for循环遍历数组的每一个元素的列子           
    [iyunv@localhost ~]# awk 'BEGIN {Arry["m"]="hello";Arry["n"]="world";for (flag in Arry) print Arry[flag]}'
     hello
     world
         
         eg:了解NF和$NF的含义
         [iyunv@localhost ~]# cat 1.txt
     welcome to redhat linux
     how are you
     [iyunv@localhost ~]# awk '{print NF}' 1.txt
     4
         3
         [iyunv@localhost ~]# awk '{print $NF}' 1.txt
         linux
         you
         解释:NF是每行字段的个数 ,$NF是每行最后一个字段的值
         
         eg:统计网络监听的状态
         [iyunv@localhost ~]# netstat -ant | awk '$1~/tcp/{ S[$NF]++ } END { for(A in S) print A,S[A] }'
     LISTEN 7
     ESTABLISHED 1
           解释:NF是每行字段的个数 ,$NF是每行最后一个字段的值,S[$NF]是 数组元素,S是定义的数组 ,A是数组下标  
           S[A]是数组元素里面存放的值   $1~/tcp/ 第一列匹配是tcp的
                         
         eg:统计/etc/passwd最后一个字段的shell的状态
         [iyunv@localhost ~]# awk -F: '$NF!~/^$/{ SHELL[$NF]++ }END {for (A in SHELL) print A,SHELL[A]}' /etc/passwd
     /bin/sync 1
     /bin/bash 1
     /sbin/nologin 16
     /sbin/halt 1
     /sbin/shutdown 1
         
         eg:统计某个日志文件中IP地址的访问量
         awk '{IP[$1]++}END{for(A in IP) print A,IP[A]}' /usr/local/apache2/logs/access_log
          解释:
       
        awk内置函数
         split { string, array [, filedsep [, seps]]}
          功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中
      [iyunv@localhost /]# awk 'BEGIN {print split("abc/def/xyz",str,"/")}'
           3
内置字符串函数:
gsub(r,s)    :在输入文件中用s替换r   //作用于全部的域
gsub(r,s,t)  :在t中用s替换r     //做用于指定的域
index(s,t)   :返回s中字符串第一个t的位置
length(s)    :返回s的长度
match(s,t)   :测试s是否包含匹配t的字符串
split(r,s,t) :在t上将r分成序列s
sub(r,s,t)   :将t中第一次出现的r替换为s
substr(r,s)  :返回字符串r中从s开始的后缀部分
substr(r,s,t):返回字符串r中从s开始长度为r的后缀部分

eg:
[iyunv@localhost home]# awk -F: 'gsub(/root/,"jack",$1){print $0}' /etc/passwd
jack x 0 0 root /root /bin/bash
[iyunv@localhost home]# awk -F: -v OFS=";" 'gsub(/root/,"jack",$1){print $0}' /etc/passwd
jack;x;0;0;root;/root;/bin/bash
[iyunv@localhost home]# awk -F: -v OFS=":" 'gsub(/root/,"jack",$1){print $0}' /etc/passwd      //把第一个域$1中root字符串换成jack
jack:x:0:0:root:/root:/bin/bash
[iyunv@localhost home]# awk -F: -v OFS=":" 'gsub(/root/,"jack"){print $0}' /etc/passwd         //没有指定作用域,所有只有是有root字符的全部替换
jack:x:0:0:jack:/jack:/bin/bash
operator:x:11:0:operator:/jack:/sbin/nologin                  
          eg:检查某个ip是否在攻击服务器
netstat -ant | awk '/80:/{split($5,clients,":");IP[clients[1]]++}END{for(A in IP) {print IP[A],A}}' | sort -rn | head -50
        解释:split($5,clients,":") 对第五个字段以":"为分隔符切割,切割完后保存在clients这个数组中 ,
               IP[clients[1]]:这个表示数组,数组的下标又是另一个数组clients的元素(这里数组的元素是客户端的ip)
                   sort -rn  进行排序   head -50取前50个
                  
netstat -ant | awk '/49867:/{split($5,clients,":");IP[B]++}END{for(A in IP) {print IP[A],A}}' | sort -rn | head -50
     解释:这个IP[B]===IP[clients[1]];B就是一个变量          
         length {[string]}
          功能:返回string字符串中字符的个数

         substr{string, start [, length]}
           功能:取string字符串中的子串,从start开始,取length个,start从1开始计数
                  
    system{command}       
           功能:执行系统command并将结果返回至awk命令
                  
    systime()
           功能:取系统当前时间
                  
一、print(结合awk使用)
   print的格式:
       print item1(字段1),item2(字段2),....
   print的要点:
(1)各字段之间使用逗号隔开,而输出时则以空白字符分隔
(2)输出的item可以为字符串或数值,当前记录的字段(eg:$1)、变量或awk的表达式,数值会先转换为字符串,后输出
(3)print命令后面的item可以省略,此时其功能相当于print $0,如果输出空白行(print "")   
         eg:
            awk 'BEGIN { print " line 1\n line 2\n line 3" }'
                  解释:打印三行
                awk -F: '{ print $1,$2 }' /etc/passwd
                  解释:指定分隔符为:显示文件中的字段1,字段2(因为/etc/passwd中的内容就是以:来区分的所有要用-F来指定分隔符)
                如果不用-F指定分隔符,默认是以空格来区分                  
二、printf
    printf命令的使用格式:
        printf format(格式),item1(字段1),item2(字段2), ....
要点:
1、其与print命令的最大不同是,print需要指定format(格式);
2、format用于指定后面的每个item的输出格式
3、printf语句不会自动打印换行符:\n(自己添加换行符)

  format格式的指示符都以%开头,后跟一个字符
  格式符:格式符可以使用修饰符,修饰符在格式符的前面
         %c:显示字符的ASCII码
         %d,%i:十进制整数
         %f:显示浮点数
         %g,%G:以科学计数法的个数或浮点数的格式显示数值
         %u:无符号整数
         %s:显示字符串
         %%:显示%自身
  修饰符:
        N:显示宽度
        -:左对齐(默认是右对齐)
        +:显示数值符号
  eg:
  awk  '{printf "%10s,%s\n",$1,$2 }' 1.txt
    解释:$1的宽度为10
三、输出重定向
  /dev/stdout       标准输出
  /dev/stderr        错误输出
  /dev/fd/N          某待定文件文件描述符,如/dev/stdin就相当于 /dev/fd/0
格式:
  print item > "outfile"
  print item >> "outfile"
  print item | 命令

  把print打印的结果直接输出到一个文件中
  eg:
   awk '{print $1,$2 >"2.txt"}' 1.txt
     解释:把1.txt的文件里面的字段1和字段2的内容直接输入到2.txt中
四、操作符
1)算术操作符
x-y,x+y,x*y,x%y...

2)字符串操作符
只有一个,而且不用写出来,用于实现字符串连接

3)赋值操作符 (/ /表示模式)
=,+=,-=,*=,^=,%= .... ++ ,--
需注意的是=,如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代

4)布尔值
awk中,任何非0值或非空字符串都为真,反之就为假(bash中的0,就为假,其它任意的数字都是真)

5)比较操作符
x>y,x>=y,x<y,x<=y,x!=y,x==y
x ~ y :y是一个模式,x给定的字符串匹配y模式 能匹配为真
x !~ y :y是一个模式,x给定的字符串不匹配y模式  不能匹配为真
eg:
    awk -F: '$1 ~ /^root/ {print $3,$4,$NF}' /etc/passwd
      解释:匹配第一个字段是root的,就打印这行的第三个字段,第四个字段,和最后一个字段,-F:以冒号做分隔符
          
6)逻辑关系符
&&
||

7)条件表达式(测试表达式)


8)函数调用
function_name (zhi1,zhi2)


五、awk中的变量:
  1)字段变量:
     $0:所处理的当前行
         $1:当前行的第一个字段
         $2:当前行的第二个字段
         ...
  2)内置变量:
     OFS:输出记录字段间的分隔符
         FS:输入记录字段间的分隔符
     ORS:输出记录的分隔符
         RS:输入记录的分隔符(默认是换行字符)
     NR:当前行数(awk命令所处理的记录数,如果有多个文件,这个数目会把处理的多个文件中行统一计数)
     NF:当前记录的字段个数,$NF是指最后一个字段。
     FNR:与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数
     ARGV:数组,保存命令本身这个字符串,如awk '{print $0}' score.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存score.txt
     ARGC:awk命令的参数的个数
  3)自定义的变量
     自定义变量必须在动作{}的里面定义
  eg:
awk '{print $0}' score.txt | tee score.out
awk '{print $1 "\t"$4}' score.txt
awk 'BEGIN{print "Name   Maths\n-----------"}{print $1"\t"$4}END{"end-if-report"}'score.txt
   解释:begin和end是产生报告头和报告尾的信息,{print $1"\t"$4} $1是打印第一列,$4是打印第四列,"\t"是以制表的行距隔开,
        \t必须加引号
cat score.txt | awk '$0~/218.79.131.96/'    //显示score.txt文件中匹配ip为218.79.131.96的所有行,匹配的操作放在/ /之间
awk '$0 !~/218.79.131.96/' score.txt      //显示score.txt文件中不匹配ip为218.79.131.96的所有行,匹配的操作放在/ /之间
awk '{if ($1 == "218.79.131.96")print $0}' score.txt  //如果第一个域等于这个ip就打印整条记录
awk '$0 ~/root/' passwd         //匹配root字符                                                                                         


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-5537-1-1.html 上篇帖子: SHELL之grep 下篇帖子: SHELL的变量和运算字符笔记

尚未签到

发表于 2013-4-27 14:12:06 | 显示全部楼层
要是我灌水,就骂我“三个代表”没学好吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-18 13:49:22 | 显示全部楼层
恐龙说:“遇到色狼,不慌不忙;遇到禽兽,慢慢享受……”

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-22 04:05:35 | 显示全部楼层
.其实我是一个天才,可惜天妒英才!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-27 16:29:34 | 显示全部楼层
勿以坑小而不灌,勿以坑大而灌之。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-6-2 20:27:42 | 显示全部楼层
如果跟导师讲不清楚,那么就把他搞胡涂吧!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-6-6 17:01:33 | 显示全部楼层
很多女明星不红的原因是因为没有张开腿*^_^*

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表