利用awk查询包含重复awk截取字符串的记录

1.正则表达式&&&&(1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。&&&(2)基本元字符集及其含义&&&&&&&^ :只匹配行首。&&&如^a 匹配以a开头的行abc,a2e,a12,aaa,......&&&&&&&$ :只匹配行尾。&&&如^a 匹配以a结尾的行bca,12a,aaa,.......&&&&&&&* :匹配0个或多个此单字符。 如(a)* 匹配 空,a,aa,aaa,....&&&&&&&[] :只匹配[]内字符。可以是一个单字符,也可以是字符序列,用","将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围,如[1-5]表示[12345]&&&&&&&\ :只用来屏蔽一个元字符的特殊含义。 如\*,\',\",\|,\+,\^,\. 等&&&&&&&.:(点)只匹配任意单字符。&&&&&&&pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa.&&&&&&&pattern\{n,\}:含义同上,但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,.....&&&&&&&pattern\{n,m\}:含义同上,但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个&&&(3)举例说明:&&&&&&&^$ :匹配空行&&&&&&&^.$ :匹配包含一个字符的行&&&&&\*\.pas :匹配以*.pas结尾的所有字符或文件&&&&&[]或[0-9] :假定要匹配任意一个数字&&&&&[a-z] :任意小写字母&&&&&[A-Za-z] :任意大小写字母&&&&&[S,s] :匹配大小写S&&&&&[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} :匹配IP地址 [0-9]\{3\}三个0-9组成的字符串;\. :匹配点(注意这里点是特殊的字符,所以要用"\"来屏蔽其含义)&2.find介绍 &&(1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。&&&(2)find命令的一般形式&&&&&&&find pathname -options [-print -exec -ok]&&&&&&&-pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录&&&&&&&-print :find命令将匹配的文件输出到标准输出&&&&&&&-exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为&&&&&&&&&'command'{} \; (注意{}和\之间的空格)&&&&&&&-ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。&&&&&options有如下几种:&&&&&-name :按照文件名查找文件&&&&&-perm :按照文件权限来查找文件&&&&&-user :按照文件属主来查找文件&&&&&-group :按照文件所属的组来查找文件&&&&&-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。&&&&&-size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。&&&&&-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在&&&&&-newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件&&&&&-depth 先查找指定目录有无匹配文件,若无则再在子目录中查找&&&&&-type 查找某一类型的文件,如&&&&&&&b :块设备文件&&&&&&&d:目录&&&&&&&e:字符设备文件&&&&&&&p;管道文件&&&&&&&l:符号链接文件&&&&&&&f:普通文件&&&(3)find命令举例&&&&&&&find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上&&&&&&&find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出&&&&&&&find . -perm 755 -print 查找当前目录下权限为755的文件,并输出&&&&&&&find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出&&&&&&&find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件&&&&&&&find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件&&&&&&&find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件&&&&&&&find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。&&&&&&&find /var -type d -print 查找/var目录下所有目录&&&&&&&find /var -type l -print 查找/var目录下所有的符号链接文件。&&&&&&&find . -size +1000000c -print 查找当前目录下大于1000000字节的文件&&&&&&&find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找&&&&&&&find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l&&&&&(4)xargs命令&&&&&&&在 使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命 令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是&参数列太长&或&参数列溢出&。这就是xargs的用处所在,特别是与 find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个&&&&&&&find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理&3.grep介绍 &&(1)grep 的一般格式为 grep [options] 基本正则表达式 [文件]&&&&&&&字符串参数最好采用是双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串&&&&&&&-c:只输出匹配行的记数&&&&&&&-i:不区分大小写(只适用于单个字符)&&&&&&&-h:查询多个文件时不显示文件名&&&&&&&-H:只显示文件名&&&&&&&-l:查询多文件时只输出包含匹配字符的文件名&&&&&&&-n:只显示匹配行及其行号&&&&&&&-s:不显示不存在或无匹配文本的错误信息。&&&&&&&-v:显示不包含匹配文本的所有行。&&&(2)举例说明:&&&&&&&grep ^[^210] myfile 匹配myfile中以非2、1、0开头的行&&&&&&&grep "[5-8][6-9][0-3]" myfile 匹配myfile中第一位为5|6|7|8,第二位6|7|8|9,第三位为0|1|2|3的三个字符的行&&&&&&&grep "4\{2,4\}" myfile 匹配myfile中含有44,444或4444的行&&&&&&&grep "\?" myfile匹配myfile中含有任意字符的行&&&(3)grep命令类名&&&&&&&[[:upper:]]&&&表示[A-Z]&&&&&&&[[:alnum:]]&&&表示[0-9a-zA-Z]&&&&&&&[[:lower:]]&&&表示[a-z]&&&&&&&[[:space:]]&&&表示空格或者tab键&&&&&&&[[:digit:]]&&&表示[0-9]&&&&&&&[[:alpha:]]&&&表示[a-zA-Z]&&&&&如:grep "5[[:digit:]][[:digit:]]" myfile 匹配myfile中含有5开头接下去两位都是数字的行。&4.awk介绍&可以从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的变成语言。&(1)awk命令行方式 awk [-F filed-spearator] 'command' input-files&&&&&awk脚本:所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。&&&&&模式部分决定动作语句何时触发及触发事件。(BEGIN,END)&&&&&动作对数据进行处理,放在{}内指明(print)&(2)分隔符、域和记录&&&&&awk执行时,其浏览域标记为$1,$2,...$n.这种方法成为域标识。$0为所有域。&(3)举例说明:&&&&&&&awk '{print $0}' test.txt |tee test.out 输出test.txt中所有行$0表示所有域&&&&&&&awk -F : '{print $1} test.txt |tee test.out'&&&同上。。只是分隔符为":"&&&&&&&awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt&&&&&&&开始时打印&IPDate&结束时打印&end-of-report&中间打印主体信息,比如总共匹配三条信息,则输出如下:&&&IPDate&1 first&2 second&3 third&end-of-report&&&(4)匹配操作符 ~ 匹配,!~ 不匹配&&&&&&&cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行&&&&&&&awk '$0!~/210.34.0.13' test.txt&&&&&匹配test.txt中不是210.34.0.13的行&&&&&&&awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。5.sed介绍 &&&&sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。&&&&&sed是一种很重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合。是一种非交互性文本流编辑。&&&&&(1)调用sed的三种方式&&&&&&&使用sed命令行格式为:sed [options] sed命令 输入文件&&&&&&&使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件&&&&&&&sed脚本文件[options] 输入文件&&&&&&&--不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。&&&&&(2)sed 命令的options如下&&&&&&&&&-n:不打印&&&&&&&&&-c:下一命令是编辑命令&&&&&&&&&-f:如果正在调用sed脚本文件&&&&&(3)sed在文件中查询文本的方式&&&&&&&&&&&--使用行号,可以是一个简单的数字,或是一个行号的范围&&&&&&&&&&&--使用正则表达式&&&&&(4)读取文本的方式&&&&&&&&&&&x&&&&&&&x为一行号&&&&&&&&&&&x,y&&&&&&&表示行号范围从x到y&&&&&&&&&&&/pattern/&&&&&查询包含模式的行&&&&&&&&&&&/pattern/pattern/ 查询包含两个模式的行&&&&&&&&&&&pattern/,x&&&在给定的行号上查询包含模式的行&&&&&&&&&&&x,/pattern/&&&通过行号和模式查询匹配行&&&&&&&&&&&x,y!&&&&&&&查询不包含指定行号x和y的行&&&&&&&(5)基本sed编辑命令&&&&&&&&&&&&&p&&&打印匹配行&&&&&&&&&&&&&d&&&删除匹配行&&&&&&&&&&&&&=&&&显示文件行号&&&&&&&&&&&&&a\&&&在定位行号后附加新文本信息&&&&&&&&&&&&&i\&&&在定位行号后插入新文本信息&&&&&&&&&&&&&c\&&&用新文本替换定位文本&&&&&&&&&&&&&s&&&&&使用替换模式替换相应模式&&&&&&&&&&&&&r&&&&&从另一个文件中读文件&&&&&&&&&&&&&w&&&写文本到一个文件&&&&&&&&&&&&&q&&&&&第一个模式匹配完成后推出或立即退出&&&&&&&&&&&&&l&&&&&显示与八禁止ASCII代码等价的控制字符&&&&&&&&&&&&&{}&&&在定位行执行的命令组&&&&&&&&&&&&&n&&&&&从另一个文件中读文本下一行,并附加在下一行&&&&&&&&&&&&&g&&&&&将模式2粘贴到/pattern n/&&&&&&&&&&&&&y&&&&&传送字符&&&&&(6)举例说明:&&&&&&&&&&&sed -n '2p' test.txt 打印第二行的信息(注意:-n是不打印不匹配的信息,若没加-n,则打印文件的所有信息而不是匹配信息)&&&&&&&&&&&sed -n '1,4p' test.txt 打印第一行到第四行的信息&&&&&&&&&&&sed -n '/los/p' test.txt模式匹配los,并打印出来&&&&&&&&&&&sed -n '2,/los/p' test.txt 从第二行开始。。知道匹配第一个los&&&&&&&&&&&sed -n '/^$/p' test.txt 匹配空行&&&&&&&&&&&sed -n -e '/^$/p' -e '/^$/=' test.txt 打印空行及行号&&&&&&&&&&&sed -n '/good/a\morning' test.txt 在匹配到的good后面附加morning&&&&&&&&&&&sed -n '/good/i\morning' test.txt 在匹配到的good前面插入morning&&&&&&&&&&&sed -n '/good/c\morning' test.txt 将匹配到的good替换成morning&&&&&&&&&&&sed '1,2d' test.txt 删除第1和2行&&&&&&&&&&&sed 's/good/good morning/g' test.txt 匹配good并替换成goodmorning&&&&&&&&&&&send 's/good/& hello /p' test.txt 匹配到good就在其后面加上hello&&&&&&&&&&&send 's/good/ hello &/p' test.txt 匹配到good就在其前面加上hello&6.合并与分割(sort,uniq,join,cut,paste,split) &&&&(1)sot命令&&&&&&&&&sort [options] files 许多不同的域按不同的列顺序排序&&&&&&&&&&&-c 测试文件是否已经排序&&&&&&&&&&&-m 合并两个排序文件&&&&&&&&&&&-u 删除所有同样行&&&&&&&&&&&-o 存储sort结果的输出文件名&&&&&&&&&&&-t 域分隔符,用非空格或tab开始排序&&&&&&&&&&&+n :n 为列号,使用此列号开始排序&&&&&&&&&&&-n 指定排序是域上的数字分类项&&&&&&&&&&&-r 比较求逆&&&&&&&&&sort -c test.txt 测试文件是否分类过&&&&&&&&&sort -u test.txt 排序并合并一样的行&&&&&&&&&sort -r test.txt 以相反的顺序排列&&&&&&&&&sort -t "/" +2 test.txt 以"/"分隔,第二个域开始分类&&&&&&&(2)uniq命令&&&&&&&&&&&uniq [options ] files 从一个文本文件中去除或禁止重复行&&&&&&&&&&&-u 只显示不重复行&&&&&&&&&&&-d 只显示有重复数据行,每种重复行只显示其中一行&&&&&&&&&&&-c 打印每一重复行出现次数&&&&&&&&&&&-f :n为数字,前n个域被忽略&&&&&&&&&&&uniq -f 2 test.txt 忽略前2个域&&&&&&&(3)join 命令&&&&&&&&&&&join [options] file1 file2 用来将来自两个分类文本文件的行连在一起&&&&&&&&&&&-an,n为一数字,用于连接时从文件n中显示不匹配行&&&&&&&&&&&-onm ,连接域,n为文件号,m为域号&&&&&&&&&&&-jnm,n为文件号,m为域号,使用其他域作连接域&&&&&&&&&&&-t ,域分隔符。用来设置非空格或tab键的域分隔符。&&&&&&&&&(4)split命令&&&&&&&&&&&split -output_file_size intput_filename output_filename&&&&&&&&&&&用来将大文件分割成小文件。&&&&&&&&&&&&&-b n,每个分割文件的大小n&&&&&&&&&&&&&-C n,每个分割文件一行最多n字节&&&&&&&&&&&&&-l n,每个分割文件的行数&&&&&&&&&&&&&-n,同-l n&&&&&&&&&&&&&split -10 test.txt 将test.txt分割成10行的小文件&&&&&&&&&(5)cut 命令&&&&&&&&&&&cut -c n1-n2 filename 显示每行从开头算起 n1 到 n2 的文字。&
&&&&&&&&&&cut -c 3-5 test.txt 显示test.txt中每行从第3到第5个字符
阅读(...) 评论()煮酒品茶 的BLOG
用户名:煮酒品茶
文章数:123
评论数:886
访问量:1079355
注册日期:
阅读量:5863
阅读量:12276
阅读量:375331
阅读量:1068650
51CTO推荐博文
#----------------------------------------------------------#
# ====&&红色字体 -特指煮酒个人所见。加粗则为需要重点注意。&#
# ====&&蓝色加粗 -特指与本文相关人员,包括参与修正的朋友。&#
# ====& 煮酒品茶 -Http://cwtea. & & & && #
#----------------------------------------------------------#
一起学shell之产生脚本以及Awk的惊人表现(七)
命令行参数分析、在远程主机上运算、环境变量、工作记录、并行处理、使用eval的运行时语句(runtime&statement)执行、草稿文件、shell函数、用户定义初始文件、以及安全性议题考虑的范例。
软件构建自动化:由于unix可运行在多种平台上,因此在构建软件包时,较常见的实现方式是从源代码开始安装,而非直接安装二进制包。
顶层configure脚本通常由GUN的autoconf命令,通过configure.in或configure.ac文件里的规则列表自动产生,执行该脚本时,有时得加上一些命令行选项,便能产生定制的C/C++头文件,通常叫config.h衍生自Makefile.in(模版文件)的一个定制的Makefile.并时有时候还会有其它文件。
Makefile目标的标准集已详述于&The&GNU&Coding&Standards&中有all(全部构建)、check(执行验证测试)、clean(删除不需要的中间文件)、distclean(恢复目录到它的原始发布),以及install(在本地系统上安装所有必需的文件)。
被安装的文件位于Makefile文件里prefix变量所定义的默认树状结构目录下,并且可在配置时使用--prefix=dir命令行选错行设置,或是通过一个本地系统范围的定制文件提供、默认的prefix为/usr/local,但无权限的用户可能使用$HOME/local或是用$HOME/`arch`/local更好,其中arch是一条命令,它会显示定义平台的简短说明。GNU/LInux与Sun&Solaris提供的是/binarch。在基它平台下,安装自己的实作程序时,通常只是使用简单的shell脚本包装(wrapper),再搭配适当的echo命令。
煮酒品茶:这就是我们经验源码安装的一些标准定义吧。有空瞧瞧nginx他的模版。原作有对这个进行很强烈的讲解并自己编写了一个码。我就不打写了,等全完之后再回头看几次,并进行一个更新,可能的话去看看nginx是如何做的。
AWK的惊人表现:
Awk设计的目的:简化一般文本处理的工作。
属于POSIX的一部分。
AWK命令行:
Awk的调用可以定义变量、提供程序并且指定输入文件:
Awk&[&-F&fs&]&&[&-v&var=value&...&]&'program'&[&&[&var=value&...&]&[&file(s)&]&Awk&[&-F&fs&]&&[&-v&var=value&...&]&-f&program'file&[&&[&var=value&...&]&[&file(s)&]&
短程序通常是直接在命令行上提供,而比较长的程序,则委托-f选项指定,遇到需连接被指名的程序文件以得到完整的程序时,则可重复使用此选项,这是包含共享awk代码的程序库存之方便用法。选项需置于文件名以及一般var=value赋值的前面。
--&是特殊选项:指出awk本身已没有更进一步的命令行选项,任何接下来的选项都可被你的程序使用。
-f选项是用来重新定义默认字段分隔字符,且一般惯例将它作为第一个命令行选项,紧接在-F选项后的fs参数是一个正则表达式,或是被提供作为下一个参数。字段分隔字符也可设置使用内建变量FS所指定的:
初始化的-v选项必须放在命令行上直接给定的任何程序之前,它们会在程序启动之前以及处理任何文件之前生效,在一命令行程序之后的-v选项会被解释为一个文件名可(能是不存在的)
在命令行上其它地方的初始化会在处理参数时完成,并且会带上文件名。例如:
Awk&'{&...&}'&Pass=1&*.tex&Pass=2&*.tex
处理文件的列表两次,第一次是Pass设为1,第二次将它设为2.
注:使用字符串值进行初始化无须用引号框起来,除非shell要求这样的引用,以保护甲址蚩瞻住VС终颉
注:特殊文件名-(连字号)表示标准输入。/dev/stdin为标准输入,/dev/stderr标准错误输出,/dev/stdout标准输出。
Awk程序模型:
Awk把输入流看作一连串记录的集合,每条记录都可进一步细分为字段,通常,一行一条记录,而字段则由一个或多个非空白字符的单词组成。然而,是什么构成一条记录和一个字段,完全是由程序员控制,且它们的定义,甚至可以在处理期间更改。
一个awk程序是一对以模式(pattern)与大括号框起来的操作(action)组合而成的。
输入会自动地由一个输入文件切换到下一个,且awk本身通常会处理每个输入文件的打开、读取和关闭,以允许用户程序专心致力于记录的处理。虽然模式多半是数据或字符串表达式,不过awk以保留字BEGIN与END提供两种特殊模式。
程序元素:awk处理数字与字符串数据,提供了标量(scalar)与数组(array)两种变量以保存数据、数字与字符串表达式。还提供了一些语句类型以处理数据:赋值、注释、条件、函数、输入、循环及输出。
由#号注释单行,单条语句多行可用反斜杠。
字符串的比较,用的是传统的关系运算符。返回1为真,0为假。Awk并无特殊的字符串接续运算符。两个连续字符串,会自动地连接在一起。
支持正则表达式,有两个运算符:~(匹配)与!~(不匹配)
正则表达式常量可以用引号或斜杠加以定介:&ABC&&~&/^[A-Z]+$/&等同于&ABC&&~&&^[A-Z]+$&&,如果在引号字符串里正好需要有字面意义的引号,则应以反斜杠(&...\&...&)保护。
Awk处理字符串转数据的函数,s&=&&123&&接着n&=&0&&+&s&,便将数据123赋值给n了。(并不适用)
Awk的数值运算符[图]
Awk可用括号以控制计算顺序。
一、复合式,像/=这样,以左边运算数作为右这的第一个去处数。N&/=3&便是n=n/3
二、赋值的结果用来作为另一个表达式的部分表达式:(赋值运算符为右结合性)
Awk里一般常用到的内建标量变量
命令行参数
Awk对于命令行的自动化处理,awk通过内变量ARGC(参数计数)与ARGV(参数向量,或参数值),让命令行参数可用。
在awk程序化模式中,通过输入文件隐含循环的每一次迭代,会处理单一记录(record),通常是一行文本,记录可进一步再侵害为更小的字符串,叫做字段(field)。
FS的默认值为单一空格,它接受特殊的解释方式&。一个或多个空白字符(空格与制表字符)以及行的开头与结尾的空白,都将被忽略。因此a&b&与a b相同。
----------------------------
[root@bogon&8csjb]#&cat&awkfs&
a b c d e f
[root@bogon&8csjb]#&awk&-F&&&&'{print&$1,$2,$3,$4,$5,$6}'&awkfs&
a&b&c&d&e&f
--------------------------------------------------
匹配单个空格设置FS&&=&&[&]&
字段可以特殊名称$1\$2、...、$NF供awk程序使用。字段引用无须是固定的,有必须的话,它们还可以转换(通过截断)为整数值:假定k为3,则值$k\$(1+2)、$(27/9)、以及$3、都引用到第三个字段。特殊字段名称$0引用到当前的记录,初始值是从输入流中读取,且记录分隔字符不是记录的一部分。引用到0到NF范围以上的字段编号是不会有错。
模式与操作构成awk程序的核心,awk的非传统数据驱动程序模式,使得它更吸引用户使用,也成就了许多awk程序的简洁形式。
模式由字符串与或数值表达式构建而成:一昊它们计算出当前输入记录的值为非零(真),则实行结合性的操作。如果模式是正则表达式,则意指此表达式会被来与整个输入记录进行匹配。
操作段落是可选地接在一个模式之后,也就是操作所在之处:它标明了如何处理该记录。
常见用法:一个print语句里包含了以逗号隔开的零或多个表达式,每个表达式会被计算,有必要时会转换为一个字符串,且以输出字段分隔字符OFS的值将输出分隔后传送到标准输出,接在最后项目之后的是输出记录分隔字符ORS的值。
-------------------------------------------------------------------------------------------
[root@bogon&~]#&echo&'1&2&3&4&5&a'&|awk&'{&OFS&=&abc&;&print&$1,$2,$3,$4,$5,$6}'
1abc2abc3abc4abc5abca
[root@bogon&~]#&echo&'1&2&3&4&5&a'&|awk&'{&OFS&=&\n&;&print&$1,$2,$3,$4,$5,$6}'
[root@bogon&~]#&echo&'1&2&3&4&5&a'&|awk&'{&OFS&=&&&;&print&$1,$2,$3,$4,$5,$6}'
1&2&3&4&5&a
------------------------------------------------------------------------------------------------------
改变输出字段分隔字符而没有指定任何字段,不会改变$0;,如果我们更改输出字段分隔字符,并指定至少一个字段(即强制以新的字段分隔字符重新组合记录)结果为
[root@bogon&~]#&echo&'1&2&3&4&5&a'&|awk&'{&OFS&=&\n&;&&print&$0}'
1&2&3&4&5&a
[root@bogon&~]#&echo&'1&2&3&4&5&a'&|awk&'{&OFS&=&\n&;&$1=$1;&print&$0}'
----------------------------------------------------------------------
如果程序为空,则awk不会读取任何输入并立即退出,所以我们可以匹配cat
除开NUL字符问题,awk可以轻松取代cat
大量实例:
要将原始数值及它们的对数打印为单栏的数据文件,可使用:
Awk&'{&print&$1,&log($1)&}'&file(s)
打印文本文件5%行左右的随机样本。使用虚拟承受机产行函数。
Awk&'rand()&&0.05'&file(s)
在以空白分隔字段的表格中,报告第n栏的和:
Awk&-v&COLUMN=n&'{&sum&+=&$COLUMN}&END&{&print&sum&}'&file(s)
------------------------------------------------------------------------------------
[root@bogon&8csjb]#&echo&&2&&|awk&-v&COLUMN=n&'{&sum&+=&$COLUMN}&END&{&print&sum&}'
&#字符视为0
[root@bogon&8csjb]#&echo&&2&&|awk&-v&COLUMN=n&'{&sum&+=&$COLUMN}&END&{&print&sum/2&}'
#算术运算符
[root@bogon&8csjb]#&awk&'/print/'&awk
#等同于grep&'print'&awk
print&&ARGC&=&,&ARGC
print&&ARGV[&&k&&]&=&[&&ARGV[k]&&]&
查找100-150行
[root@bogon&8csjb]#&awk&'(1&&=&FNR)&&&&(FNR&&=15)&&&&/print/&{print&FILENAME&&:&&FNR&&:&&$0&}'&awk
awk:2: print&&ARGC&=&,&ARGC
print&&ARGV[&&k&&]&=&[&&ARGV[k]&&]&
用sed如下:
[root@bogon&8csjb]#&sed&-n&&1,15p&-s&awk&|egrep&'print'
print&&ARGC&=&,&ARGC
print&&ARGV[&&k&&]&=&[&&ARGV[k]&&]&
[root@bogon&8csjb]#&awk&'BEGIN&{&FS&=&&print&;&OFS&=&&&&&}&{&$1=$1;print}'&awk
&&&ARGC&=&,&ARGC
for&(k=0;&k&ARGC;&k++)
&&&ARGV[&&k&&]&=&[&&ARGV[k]&&]&
删除已排序流里的重复行:
Sort&file(s)&|uniq
Sort&file(s)&|&awk&'Last&!=$0&{&print&}&{&Lst&=$0&}'
将回车字符/换行字符的行终结,一致转换为以换行字符作为行终结。
Sed&-e&'s/\r$//'&file(s)
Sed&-e&'s/^M$//'&file(s)
#^M&ctrl+M
Mawk&''BEGIN&{&RS&=&&\r\n&&}&{print&}'&file(s)&&
要将单空格的文本行,转换为双空格的行。
-------------------------------------------------------------------------------------------------------
[root@bogon&8csjb]#&sed&-e&'s/$/\n/'&awk
print&&ARGC&=&,&ARGC
for&(k=0;&k&ARGC;&k++)
print&&ARGV[&&k&&]&=&[&&ARGV[k]&&]&
[root@bogon&8csjb]#&awk&'BEGIN&{&ORS&=&&\n\n&}&{print}'&awk& #记录分隔符ORS
[root@bogon&8csjb]#&awk&'BEGIN&{&ORS&=&&\n\n&}&1'&&awk
[root@bogon&8csjb]#&awk&'{&print&$0&&\n&}'&&&awk
[root@bogon&8csjb]#&awk&'{&&print&&&&}'&&&awk
将双空格行转换为单空格一样是很容易的:
[root@bogon&8csjb]#&awk&'{&&print&&&&}'&&&awk|awk&'BEGIN&{RS&=&\n&*\n&&}&{print}'
print&&ARGC&=&,&ARGC
for&(k=0;&k&ARGC;&k++)
print&&ARGV[&&k&&]&=&[&&ARGV[k]&&]&
寻找超过限制长度72个字符的行
egrep&-n&'^.{73,}'&file(s)
[root@bogon&8csjb]#&awk&'length($0)&&3&{print&FILENAME&&:&&FNR&&:&&$0&}'&awk&
awk:1:BEGIN{
awk:2: print&&ARGC&=&,&ARGC
awk:3: for&(k=0;&k&ARGC;&k++)
print&&ARGV[&&k&&]&=&[&&ARGV[k]&&]&
查找html标题内容
Awk&-v&ORS='&'&-v&RS='(&\n)'&'/&title&*&/,&/&\/tiltle&*&/'&file(s)&|&sed&-e&'$@&/title&*&&*@&\n@g'
煮酒品茶:可以更新批量下载网页那东西了,取标题页。@与/没区别。特别环境特别使用。
语句:程序语言必须支持连续性的、条件式的及重复的执行。
连续执行如:a=1;b=2;c=3
条件式执行:
If&(expression)
Statement1
重复执行:(while、do)&(for、for)
注意:因为浮点算术通常不精确,所以避免在for语句表达式里,计算非整数的值。
其它的流程控制语句
只针对此记录略过更进一步的模式检查。
使用Next语句。
针对当前输入文件略过更进一步的模式检查。
Gawk与近期的nawk都提供nextfile语句,它会使得当前输入文件立即关闭且模式的匹配会从命令行上下一个文件里的记录重新开始。
用户控制的输入
Awk直接处理命令行上标明的输入文件,意指绝大多数的awk程序都不必自己打开与处理文件。它也可以通过awk的getline语句来做这件事情。
awk支持重定向。
基础数值函数
&本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》
11:49:20 15:23:57 15:26:30 15:53:33 17:21:49 23:35:48 07:30:53 09:24:04 10:02:56 18:03:35 18:21:12 23:43:55 12:04:19 11:29:50

我要回帖

更多关于 awk截取字符串 的文章

 

随机推荐