awk-实践

  1 #!/usr/bin/awk -f
  2 # 在系统提示下输入脚本
  3 # 本文为awk笔记
  4 #
  5 # ********************************************************************************************************************************************
  6 # awk    命令格式
  7 #        awk [options] ‘pattern{action}‘ [var1=value1 var2=value2] files
  8 #        模式部分和操作部分都是可选的.如果没有指定模式,则操作会应用到全部的记录[zyn1];如果没有指定操作部分,则会输出匹配的全部记录.[zyn2]
  9 #        模式部分和操作部分都是可以出现多次.
 10 #
 11 # ********************************************************************************************************************************************
 12 #
 13 # options    选项部分
 14 #        -f    从脚本中读取awk命令
 15 #        -F    指定多个字段分割符[zyn3]
 16 #        -v    赋值一个用户定义变量[zyn4]
 17 #
 18 # ********************************************************************************************************************************************
 19 #
 20 # pattern    模式部分
 21 #        由某种表达式组成的语句,模式不能被括在{}内:
 22 #        BEGIN{}    指定在第一条输入记录被处理之前发生的动作;
 23 #        END{}    指定在最后一条输入记录之后发生的动作;
 24 #        判别条件真伪的表达式:~表示匹配,!~表示不匹配;字符串或数字比较;关系运算;[zyn5]
 25 #        /模式1/,/模式2/    指定一个行的范围.[zyn6]
 26 #
 27 # ********************************************************************************************************************************************
 28 #
 29 # action    操作部分
 30 #        由{}括起的一条或多条语句组成,语句间用;或者换行符分割,默认操作是打印所有表达式结果为真的文本行:
 31 #            格式化输出;
 32 #            变量或数组操作;
 33 #            内置函数;
 34 #            控制流命令
 35 #
 36 # ********************************************************************************************************************************************
 37 #
 38 # 脚本文件格式
 39 #        如果同一行上有多个语句或操作,必须用;隔开;如果每条语句都在不同的行上,可以不用加;
 40 #        如果操作跟在某个模式后面,它的{就必须与该模式在同一行[zyn2],[zyn5],[zyn6],[zyn7]
 41 #        注释要一#开头
 42 #
 43 # ********************************************************************************************************************************************
 44 #
 45 # 正则表达式元字符
 46 # ^在串首匹配        $在串尾匹配            .匹配任意单个字符        *匹配零个或多个前一个字符
 47 # +匹配一个或多个前一个字符        ?匹配零个或一个前一个字符        []匹配指定字符串组
 48 # [^]匹配任意一个不在指定字符串组        |匹配两者之一        ()+匹配一个或多个组合
 49 # &用在代替字符串中,代表查找串中匹配到的内容[zyn9]
 50 #
 51 # ********************************************************************************************************************************************
 52 #
 53 # 正则表达式POSIX字符类
 54 # [:alnum:]文字数字字符        [:alpha:]文字字符        [:digit:]数字字符        [:graph:]非空字符(包括空格)
 55 # [:punct:]标点符号        [:lower:]小写字符        [:upper:]大写字符        [:cntrl:]控制字符
 56 # [:space:]所有空白字符(空格,新行,制表符)        [:xdigit:]十六进制数字    [:blank:]空格和制表符
 57 #
 58 # ********************************************************************************************************************************************
 59 #
 60 # 关系运算符:<,<=,>,>=,==,!=
 61 #            ~,!~在正则中的匹配,不匹配
 62 # 条件表达式:?:三元运算符,if else
 63 # 逻辑运算符:||,&&,!
 64 # 算数运算符:+,-,*,/,%,^(求冥),&(求余),++(一元加),--(一元减),赋值=,+=,-=,*=,/=,%=,^=,**=
 65 # 范围:/../,/../
 66 #
 67 # ********************************************************************************************************************************************
 68 #
 69 # 影响流程控制的语句
 70 #    除了if,while,for,do之外,还有break,continue,next
 71 #        在一个循环中的两个影响流程控制的break以及continue:break是退出循环,continue是终止当前的循环,并开始下一次的循环;
 72 #        next:可以连续从文件读取内容,忽略脚本的其他操作直到文件被读完[zyn10],[zyn11]
 73 #        exit:exit使主输入循环退出控制,执行END{}中的操作,如果没有END{},或者换行符分割是在END{}中应用了exit,则终止脚本执行.
 74 #
 75 # ********************************************************************************************************************************************
 76 # getline函数,注意它不用加上()
 77 #        getline函数用于从输入中读取下一行,它不仅能读取正常的数据流,而且能处理来自文件和管道的输入[zyn12][zyn13]
 78 #        getline函数可能的返回值为:1 如果能够读取一行.0 如果到了文件末尾.-1 如果遇到错误
 79 #        getline函数读取新的行之后,会将其赋值给$0,并且将其分解成字段,同时设置了系统变量NF和NR以及FNR,如若不想改变$0,可将其赋值给别的变量,但是系统变量还是会被设置的
 80 # close()函数用于关闭打开的文件和管道
 81 #        在不同的系统中,能打开的管道的数量是不同的,但是是都有一定数量的限制的;
 82 #        关闭一个管道使得你可以运行同一个命令两次;[zyn13]
 83 #        关闭一个输出管道是必要的[zyn14]
 84 # ********************************************************************************************************************************************
 85 #
 86 #
 87 # [zyn1]
 88 # awk -f awk.awk lianxi.txt
 89 #BEGIN{printf "%s\n","没有模式部分";}
 90 #{
 91 #    print $0;
 92 #}
 93 #END{}
 94 #
 95 #
 96 # [zyn2]
 97 #BEGIN{printf "%s\n","没有操作部分";}
 98 #$0~/^$/{
 99 #    print $0;
100 #}
101 #END{}
102 #
103 #
104 # [zyn3]
105 # echo ‘1,2,3,4,5,6‘|awk -f awk.awk
106 #BEGIN{FS=",";OFS="-";}
107 #{
108 #    print $1,$2,$3,$4,$5;
109 #}
110 #END{}
111 #
112 #
113 # [zyn4]
114 # -v    awk -vname=$USER -f awk.awk rizhi.txt 使用的是系统变量
115 #        awk -vname="haha" -f awk.awk rizhi.txt 自定义变量
116 #        awk -vname="haha" -vhome="gg" -f a.awk rizhi.txt    多个变量
117 # awk -vname="zhaoyingnan" -vhome="hebei" -f awk.awk lianxi.txt
118 #BEGIN{OFS="-";}
119 #{}
120 #END{printf "name:%s,home:%s",name,home;}
121 #
122 #
123 # [zyn5]
124 # 在每个非空的行的结尾追加字符,且保留源文件的空行
125 # awk -f awk.awk lianxi_5.txt
126 #BEGIN{}
127 #$0~/^$/{
128 #    print $0;
129 #}
130 #$0!~/^$/{
131 #    print $0"<br/>";
132 #}
133 #END{}
134 #
135 #
136 # [zyn6]
137 #BEGIN{PS="\"";OFS="\T";}
138 #/<h4>/,/<\/h4>/{
139 #        print $0;
140 #        print $2;
141 #}
142 #END{}
143 #
144 #
145 # [zyn7]
146 # awk -f awk.awk lianxi6.txt
147 #BEGIN{FS="\t"}
148 #/^[A]/{
149 #    print $0;
150 #}
151 #$2~/^[rR]/{
152 #    print $0;
153 #    }
154 #$2~/^[^rR][^2].*/{
155 #    print $0;
156 #    }
157 #END{}
158 #
159 #
160 # [zyn8] fail
161 # POSIX字符类 需要开启posix支持
162 # awk --posix -f awk.awk lianxi6.txt
163 #BEGIN{}
164 #$2~/^[rRaAbB][[:digit:]].*/{
165 #    print $0;
166 #    }
167 #END{}
168 #
169 #
170 # [zyn9] fail
171 # &使用
172 #BEGIN{}
173 #/^[rR][sS]/{
174 #    print $0;
175 #}
176 #END{}
177 #
178 #
179 # [zyn10]
180 # 将国家名称顺序修改
181 # awk -f awk.awk country.txt
182 #BEGIN{
183 #    printf "%s\t\t%s\t\t%s\t\t\n","英文全称","英文缩写","中文全称";
184 #}
185 #{
186 #    if(NR%3!=0)
187 #        printf "%s\t\t",$0;
188 #    else
189 #        printf "%s\n",$0;
190 #}
191 #END{}
192 #
193 #
194 # [zyn10]
195 # 世界各中英文对照表
196 # awk -f awk.awk country_format.txt country_yingwen.txt
197 #BEGIN{FS=",";OFS="\t";}
198 #FILENAME=="country_format.txt"{
199 #    split($0,entry,",");
200 #    country[entry[1]]=entry[3];
201 #    next
202 ##    print entry[1],entry[2],entry[3];
203 #}
204 #/[A-Z][a-z]+/{
205 #    for(i=1;i<=NF;i++)
206 #    {
207 #        if($i in country)
208 #        {
209 #            $i=country[$i]"("$i")";
210 #        }
211 #    }
212 #    print $1,$2,$3;
213 #}
214 #END{}
215 #
216 #
217 # [zyn11]
218 # 星期月份对照表
219 # awk -f awk.awk week_and_month_mix.txt week_and_month_desc.txt
220 #BEGIN{FS=",";}
221 #FILENAME=="week_and_month_mix.txt"{
222 ##week_and_month_mix/txt文件的每一行都会执行action的操作
223 #    split($0,swap,",");
224 #    week[swap[2]]=swap[3]" "swap[1];
225 #    next
226 #}
227 #/[A-Z][a-z]+[.]?/{
228 ##只有从不同文件输入内容的时候才会执行
229 #    for(i=1;i<=NF;i++)
230 #    {
231 #        if($i in week)
232 #        {
233 #            $i=$i"("week[$i]")";
234 #        }
235 #    }
236 #    print $0;
237 #}
238 #END{}
239 #
240 #
241 # [zyn12]
242 # 测试getline执行流程
243 #
244 #BEGIN{}
245 #/^(AB).*/{
246 #    print $0;
247 #    while(getline>0)
248 #    {
249 #        if($0~/^(KL).*/)
250 #        {
251 #            a=$0;
252 #            print a;
253 #        }
254 #        else
255 #            break
256 #    }
257 #}
258 #END{}
259 #
260 #
261 # [zyn13]
262 # getline 从管道读入输入
263 #BEGIN{}
264 #{
265 #    "whoami"|getline me;
266 #    close("whoami");#这里必须将这个管道关掉,否则下面的不能用哟
267 #    "whoami"|getline my;
268 #    "pwd"|getline path;
269 #    print $0,me,my,path;
270 #}
271 #END{}
272 #
273 #
274 # [zyn14]
275 # close()关闭一个输出管道
276 #BEGIN{filename="sort7.txt"}
277 #{
278 #    print $0|"sort > sort7.txt"
279 #}
280 #filename=="sort7.txt"{
281 #    while((getline < filename)>0)
282 #    {
283 #        print $0;
284 #    }
285 #}
286 #END{}
287 #
288 #
289 # ********************************************************************************************************************************************
290 # awk中的函数
291 # gsub(pattern,replace,subject)
292 # 在字符串subject用replace替换和正则表达式pattern相匹配的所有字符串,返回被替换的个数,若没有提供subject则默认为$0
293 # sub(pattern,replace,subject)
294 # 和gsub相同,不同的是,gsub是所有位置的替换,sub只替换第一个位置哟
295 # awk -f awk.awk 10_zhaoyingnan.log
296 #BEGIN{FS="\"";}
297 #{
298 #    sub(/\//,"_",$16);
299 #    gsub(/\//,"_",$16);
300 #    gsub(/\.[jJ][pP][Gg]/,".jpg",$16);
301 #    print $16
302 #}
303 #END{}
304 #
305 #
306 # index(subject,search)
307 # 返回子串search在subject中的位置,若没有则返回0
308 # substr(subject,starposion,length)
309 # 返回subject中从startposion开启,最大长度为length的子串,若没给出length,则返回从startposion开始到结束的子串
310 # awk -f awk.awk 10_zhaoyingnan.log
311 #BEGIN{FS="\""}
312 #{
313 #    print $16,index($16,"pai");
314 #    print $16,index($16,"suipai");
315 #    print $16,substr($16,index($16,"c180"));
316 #}
317 #END{}
318 #
319 #
320 # tolower(subject)将字符串subject中所有的大写字符转换为小写,返回新的字符串
321 # toupper(subject)将字符串subject中所有的小写字符转换为大写,返回新的字符串
322 # awk -f awk.awk 10_zhaoyingnan.log
323 #BEGIN{FS="\""}
324 #{
325 #    print $16,tolower($16),toupper($16);
326 #}
327 #END{}
328 #
329 #
330 # length(subject) 返回subject的长度,若没有指定subject,则返回$0的长度
331 #
332 #BEGIN{FS="\""}
333 #{
334 #    print length,length($16),"中文长度"length("中文");
335 #}
336 #
337 #
338 # match(subject,pattern)
339 # 如果正则表达式pattern在subject中出现,则返回出现的启始位置,并设置RSTART为该位置,设置RLENGTH为匹配字符串的字符数,否则返回0,并设置RSTART为0,RLENGTH为-1;
340 # echo "APPLE,PALNE"|awk -f awk.awk
341 #BEGIN{FS=","}
342 #{
343 #    for(i=1;i<=NF;i++)
344 #        print $i,match($i,/[A-Z]+/),RSTART,RLENGTH;
345 #}
346 #END{}
347 #
348 #
349 # split(subject,array,decollator)
350 # 使用分隔符decollator将subject分解到array数组中,返回元素的个数,如没有给出decollator则使用FS
351 #BEGIN{FS=","}
352 #{
353 #    split($0,array)
354 #    for(i in array)
355 #        print array[i]
356 #}
357 #END{}
测试用到的文件
sed -n ‘/^#\s*awk.*\.[tl]/p‘ awk.awk |uniq
# awk -f awk.awk lianxi.txt
#        awk -vname="haha" -f awk.awk rizhi.txt 自定义变量
#        awk -vname="haha" -vhome="gg" -f a.awk rizhi.txt    多个变量
# awk -vname="zhaoyingnan" -vhome="hebei" -f awk.awk lianxi.txt
# awk -f awk.awk lianxi_5.txt
# awk -f awk.awk lianxi6.txt
# awk --posix -f awk.awk lianxi6.txt
# awk -f awk.awk country.txt
# awk -f awk.awk country_format.txt country_yingwen.txt
# awk -f awk.awk week_and_month_mix.txt week_and_month_desc.txt
# awk -f awk.awk 10_zhaoyingnan.log

有些忙,也有些烦,但还是会静下心来学习.学无止境啊.

实际中遇到的问题

  1. NR和FNR,首先,若是读取一个文件的话,他们是一样的,若是读取多个文件,NR是这几个文件行数的总和,但FNR则在每次读取新的文件时都会从1开始.
  2. 使用awk 将文件中的时间戳转化为日期,可以使用system调用date

    1 echo 1444440491|awk ‘{system("date -d @\""$0"\" \"+%F %T\"")}‘
    2 2015-10-10 09:28:11

  3. 打印指定的字段到最后(使用循环)

    ps -ef |grep ‘/usr/local/php/bin/php excute.php‘ --color|awk ‘{ if(NF>=15){ for(i=10;i<=NF;i++){ if(NF==i){ printf "%s\n",$i; }else{ printf "%s ",$i; } } } }‘|awk ‘{ for(i=1;i<=NF;i++){ print $i; } }‘|sort -n -t _ -k 5|wc -l
  4. 指定多个分隔符时,最好不要偷懒,需要写成 -F "[.......]"

    1 #!/bin/bash
    2 #批量修改文件
    3 #oldsix-11.html  -> linux-11.HTML
    4 for file in `ls`
    5 do
    6     mv $file `echo $file|awk -F "[-.]" ‘{printf "%s%s%s","linux-",$2,"."toupper($3)}‘`
    7 done
时间: 2024-08-10 23:27:25

awk-实践的相关文章

正则四

============================== 00. 课程回顾说明 三剑客命令老二: sed 1) 概述说明 a 擅长对行进行操作 b 擅长编辑修改文件(后向引用前向) 2) 命令执行过程 1. 按行读取文件内容 2. 将每一行读取出来,存放模式空间 3. 检查是否匹配上了需求 匹配上了: 进行操作处理 增 删 改 没有匹配: 将一行内容进行默认输出,再读取下一行 PS: 不想让信息默认输出 -n 取消默认输出 4. 处理操作完成后, 会继续处理下一行 3) 命令实际操作演示 查

shell问题案例及三剑客awk与sed解决实践

20150418周末小题 原始数据: 17/Apr/2015:09:29:24 +0800 17/Apr/2015:09:30:26 +0800 17/Apr/2015:09:31:56 +0800 18/Apr/2015:09:34:12 +0800 18/Apr/2015:09:35:23 +0800 19/Apr/2015:09:23:34 +0800 19/Apr/2015:09:22:21 +0800 20/Apr/2015:09:45:22 +0800 期望结果: 2015-04-1

使用awk统计字段重复实践

awk awk是一种规格化文件的分析工具, 主要处理对象类似数据库导出的条目文本文件, 其中一行,就对应一个记录,每个记录包含若干个字段. 类似这种文本: [[email protected] ~]# last -n 5 <==仅取出前五行 root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41) root pts/1 19

使用GoAccess分析Nginx日志以及sed/awk手动分析实践

前言 使用Nginx的网站可能会遇到访问流量异常.被友情检测.程序出现Bug等各种突然情况,这时大家的反应想必都是第一时间分析日志,然后发现日志有几十GB之多,又需要按照时间.错误类型或者关键字段检索信息时会不会有种醍醐灌顶.菊花一紧的错觉.文中介绍的方法不管是GoAccess还是sed/awk虽然可以解决一时的问题但未必能够治本,也许ELK(Logstash+ElasticSearch+Kibana)对我们大多数人来说是更合理的集中化日志管理解决方案. 日志固然重要,但努力建设适合业务发展的集

运维自动化工具Cobbler之——安装实践

运维自动化工具--Cobbler实践 第1章 About Cobbler 1.1 Cobbler Introduction Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装.重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等. Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),还提供了API接口,可以方便二次开发使用.Cobbler是较早前的kickstart的升级版,优点是比较容易配置,还自带web

管理openstack多region介绍与实践

转:http://www.cnblogs.com/zhoumingang/p/5514853.html 概念介绍 所谓openstack多region,就是多套openstack共享一个keystone和horizon.每个区域一套openstack环境,可以分布在不同的地理位置,只要网络可达就行.个人认为目的就是为了提供环境隔离的功能,选择启虚拟机的时候可以根据自己所处的位置就近选择. 既然提到region了,那不如就此总结下openstack中其他的至上而下的不同的区域概念. Region

阿里云centos6.5实践编译安装LNMP架构web环境

LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构. 本次测试需求: **实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 ngx_pagespeed 优化前端 xcache 优化php 用 google_perftools 优化nginx 和 php内存分配 ** 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率. 作为负载均衡服务器:Nginx 既可以在内部直接支持Rail

Celery的实践指南

celery原理: celery实际上是实现了一个典型的生产者-消费者模型的消息处理/任务调度统,消费者(worker)和生产者(client)都可以有任意个,他们通过消息系统(broker)来通信. 典型的场景为: 客户端启动一个进程(生产者),当用户的某些操作耗时较长或者比较频繁时,考虑接入本消息系统,发送一个task任务给broker. 后台启动一个worker进程(消费者),当发现broker中保存有某个任务到了该执行的时间,他就会拿过来,根据task类型和参数执行. 实践中的典型场景:

shell获取进程ID的方法: pidof | pgrep | ps-A+grep+awk

shell获取进程ID的方法: 我知道和实践过的有这么三种: ps -A |grep "cmdname"| awk '{print $1}' pidof "cmdname" pgrep "cmdname" 这三种在bash和busybox ash里面的运行结果稍有不同, 第一种完全相同,但是因为调用命令次数较多,性能上是不行的. 第二种: pidof 只能获取程序的文件名匹配到的进程号,在ash中 比如 pidof "usr/bin/t

Linux shell一行流编程实践

Linux下很多命令用起来真相当方便,尤其是进行批处理操作时.(话说感觉这种程序也不复杂,windows咋一直不搞一个好用的shell呢) 这里列出一些常用shell操作的应用,具体命令的用法与解释就不列了,网上有很多很好的教程. 批量重命名 假如当前目录下有若干.wma文件,我希望把它们批量转成.mp3文件 例: 001.wma -> 001.mp3 解决方案: awk ? 1 ls * | awk -F '.' '{print "mv "$0" "$1&q