做视频链接哪个网站好,怎么做能让网站尽快收录,设计图片的手机软件,网络科技公司网站制作AWK高级编程 转载 转载自#xff1a;http://blog.csdn.net/wzhwho/article/details/5513791 1. 程序元素 一个awk 程序是一对以模式(pattern) 与大括号框起来的操作(action) 组合而成的#xff0c;或许#xff0c;还会加上实现操作细节的函数(function ) 。针对每个匹配于输…AWK高级编程 转载 转载自http://blog.csdn.net/wzhwho/article/details/5513791 1. 程序元素 一个awk 程序是一对以模式(pattern) 与大括号框起来的操作(action) 组合而成的或许还会加上实现操作细节的函数(function ) 。针对每个匹配于输人数据的模式操作会被执行且所有模式都会针对每条输人记录而检查。模式或操作可省略其中一个。如果模式省略则操作将被应用到每条输人记录; 如果操作省略则默认操作为打印匹配之记录在标准输出上。以下是传统awk 程序的配置: pattern {action} 如模式匹配则执行操作 pattern {action} 如模式匹配则打印记录 虽然模式多半是数字或字符串表达式不过awk 以保留字BEGIN 与END 提供两种特殊模式。 与BEGIN 关联的操作只会执行一次在任何命令行文件或一般命令行赋值被处理之前但是在任何开头的一V 选项指定已经完成之后。 END 操作也是只执行一次用于所有输入数据已被处理完之后。它多半用于产生摘要报告或是执行清除操作。 BEGIN 与END 模式可以是任意顺序可以存在于awk 程序内的任何位置。不过为了方便我们通常将BEGIN 模式放在程序的第一个位置而将END 模式放在最后。 2. 注释与空白 awk 里的注释是从# 开始到该行结束就像在Shell 里那样。空行等同于空的注释。 3. 字符串与字符串表达式 awk 字符串包含零至多个字符且在字符串的长度上没有限制视可用内存而定。 字符串的比较用的是传统的关系运算符( 相等) 、!( 不等) 、( 小于) 、( 小于等于) 、( 大于) 以及( 大于等于》。比较后返回l 为真0 为假。比较不同长度的字符串且其中一个字符串为另一个的初始子字符串时较短的会定义为小于较长的那个因此“A ” “AA ”的值为真。 awk 并无特殊的字符串接续运算符。也就是说两个连续字符串会自动地连接在一起。以下每一组赋值设置标量变量。为相同的具有四个字符的字符串: s “ABCD ” s “AB ”“CD ” s “A ”“B ”“CD ” s “A ”“B ”“C ”“D ” 字符串不需要是常数如果我们继续上述的赋值: t s s s 则t 的值为“ABCDABCDABCD “。. 将数字转换为字符串通过数字连接空字符串即可 n 123 接着是 s ““ n 把值“123 ”赋给s 。 awk 功能强大的地方大多来自于它对正则表达式的支持。有两个运算符~( 匹配) 与!~( 不匹配) 让awk 更容易使用正则表达式”ABC ”~ ”^[A-Z]$ “结果为真。 4. 数值与数值表达式 所有awk 里的数字都以双精确度的浮点值表示。浮点数可以包含一个末端以字母e( 或E) 所表示的10 次方指数以及可选地带正负号的一个整数。举例来说:0.03125, 3.125e-2, 3125e-5 与0.003125E1 同样都是表示1/32 。因为awk 里所有算术都是浮点算术。 awk 并没有提供字符串转数字的函数不过awk 的做法很简单只要加个零到字符串里例如s123 接着是n0s 便将数字123 赋值给n 了。 5. awk 的数值运算符 表9 一awk 的数值运算符( 优先级由大到小排列) 运算符 说明 -- 增加与减少( 前置或后置)^ ** 指数( 右结合性)! - 非、一元(unary) 加号、一元减号* / % 乘、除、余数 - 加、减 ! 比较 逻辑AND( 简写)|| 逻辑OR( 简写)?: 三元条件式 - * / % ^ ** 赋值( 右结合性) 6. 标量变量 保存单一值的变量叫做标量变量。 a wk 的变量名称必须以ACSII 字母或下划线开始然后选择性地接上字母、下划线及字。因此变量名称要匹配正则表达式[A-Za-z-][A-Za-z_0-9]* 。变量名称在实际上并没有长度的限制。awk 的变量名称是与大小写有关的:foo, Fo 。与FOO 是完全不同的三个名称。一般使用上以及建议用法是: 养成习惯将局部变量全设为小写、全局变量第一个字母为大写而内建变量则全是大写。 7. 数组变量 awk 允许在数组名称之后以方括号将任意数字或字符串表达式 括起来作为索引。例如: telephone[Alice] “555-0134telephone[Bob] “555-0135telephone[Carol”] “555-0136telephone[Don] “555-0141 以任意值为索引的数组称之为关联数组因为它们的名称与值是相关联的。重要的是awk 将其应用于数组中允许查找( find ) 、插入(insert ) 以及删除( remove) 等操作在一定的时间内完成与存储多少项目无关。 一个变量不能同时用作标量变量和数组变量。当你应用delet 。语句删除数组的元素 (element] 的时候不会删除它的名称。因此。像这样的代码: x[1]3 delete x x789 会引发awk 发出提示告诉你不可以给数组名称赋值. 8. 命令行参数 awk 通过内建变量ARGC( 参数计数) 与ARGV( 参数向量或参数值) 让命令行参数 可用。下面简短的程序说明其用法; [rootlocal~]#cat showargs.awkBEGIN{print ”ARGC ”ARGCfor (k0;kARGC; k)print ARGV[”k”][”ARGV[k] “} 再来看看将它用在一般awk 命令行上会产生什么样的结果: [rootlocal~]# awk -v One1 -v Two2 -f showargs.awk Three3 file1 Four4 filet2 file3ARGC6ARGV[0][awk]ARGV[1][Three3]ARGV[2][file1]ARGV[3][Four4]ARGV[4][file2]ARGV[5][file3] 9. 环境变量 awk 提供访问内建数组ENV 工RON 中所有的环境变量: [rootlocal~]#awk BEGIN {print ENVIRON[HOME];print ENVIRON[USER]} ‘/home/Joneshones 通常你应将ENVIRON 看成是一个只读数组。 10. 模式 模式由字符串与 / 或数值表达式构建而成。常用的模式如下 NF0 选定空记录 NF3 选定拥有三个字段以上的记录 NR5 选定第 1 到第 4 条记录 (FNR3)(FILENAME~/[.] [ch]$/) 来源于 C 源文件中选定记录 3 $1~/Jones/ 选定字段 1 里有 . ” jones “的记录 /[Xx][Mm][Ll]/ 选定含有‘ XML 。的记录并忽略大小写差异 $0~/[Xx][Mm][Ll]/ 同上 11. 操作 以最简单的形式来说纯print 意指在标准输出上打印当前的输入记录($0) 接着是输出记录分隔字符)ORS 的值默认为单一换行字符。因此下面这些程序所做的全是相同的操作: 1 模式为真默认操作为打印 NR0 {print} 有记录时打印( 恒为真) 1 {print} 模式为真。则打印这是默认值 {print} 无模式则视为真明确的打印这是默认值 {print $0} 相同但打印明确的值 下面的例子已经是完整的awk 程序。在每一个中我们都只显示前三个输入字段并通过省略选定模式选定所有的记录。awk 程序语句以分号分隔而且我们会使用些略微不同的操作代码以修改输出字段分隔字符: [rootlocal~]#echo ‘one two three four| awk ‘{print $1,$2,$3}’one two three[rootlocal~]#echo ‘one two three four| awk ‘{OFS”…”;print $1,$2,$3}’one…two…three[rootlocal~]#echo ‘one two three four| awk ‘{OFS”/n”;print $1,$2,$3}’onetwothree 改变输出字段分隔字符而没有指定任何字段不会改变$0: [rootlocal~]#echo ‘one two three four| awk ‘{OFS”/n”;print $0}’one two three four 不过如果我们更改输出字段分隔字符并指定至少一个字段( 即使我们未变更其值) 强制以新的字段分隔字符重新组合记录则结果为: [rootlocal~]#echo ‘one two three four| awk ‘{OFS”/n”;$1$1;print $0}’onetwothreefour 12. 在awk 中的单行程序 1.UNIX 单词计数程序wc; [rootlocal~]#awk ‘{Clength($0)1;wNF} END {print NR, W, C}’ 2. 撇开NUL 字符问题awk 其实可以轻松取代cat 下面这两个例子会产生相同输出: [rootlocal~]# cat*.xml[rootlocal~]# awk 1*.xml 3. 要将原始数据值及它们的对数打印为单栏的数据文件可使用: [rootlocal~]# awk ‘{print $1, log($1)}’file(s) 4. 在以空白分隔字段的表格中报告第n 栏的和: [rootlocal~]# awk -v COLUMNn ‘{sum$COLUMN} END {print sum} ’file (s) 5. 微调上述报告产生字段n 的平均值: [rootlocal~]# awk -v COLUMNn ‘{sum$COLUMN} END {print sum/NR } ’file (s) 6. 针对花费文件( 其记录包含描述与金额于最后一个字段) 打印花费总数。可使用内建变量NF 计算总值: [rootlocal~]# awk’{sum$NF; print $0, sum}’files) 7. 这里是三种查找文件内文本的方式: [rootlocal~]#egrep ‘pattern|pattern’ file (s)[rootlocal~]#awk ‘/pattern|pattern/’file (s)[rootlocal~]#awk ‘/pattern}pattern/ {print FILENAME ”: ”FNR ”: ”$0} ’file(s) 8. 如果你要限制仅查找100 一150 行可以通过两个工具程序再搭配管道不过这么做会漏掉位置信息: [rootlocal~]#sed -n -e 100,150p -s file(s) | egrep pattern 使用GNU sed 要搭配-s 选项才能为每个文件重新开始行编号。另外你也可以通过awk 使用比较花哨的模式来做: [rootlocal~]#awk ‘(100FNR) (FNR 150) /pattern//
{print FILENAME ”:” FNR ”:”$0}’file(s) 9. 要在一个四栏表格里调换第二与第三栏假设它们是以制表字符分隔那么可以 使用下面三种方式的其中一种: [rootlocal~]#awk -F/t’-v OFS/t’{print $1, $3, $2, $4}’old new[rootlocal~]#awk ‘BEGIN{FSOFS/t}{print $1, $3 $2 $4} ’oldnew[rootlocal~]#awk –F ‘/t’{print $1/t $3/t $2/t $4}’oldnew 10. 要将各栏分隔字符由制表字符( 在此以·显示) 转换成 可在以下两种方式择一: [rootlocal~]#sed -e s/ ·//g file(s)[rootlocal~]#awk ‘{BEGIN{FS/t;OFS “ ”}{$1$1; print} ’file(s) 11. 下面这两个管道都为删除已排序流里的重复行 [rootlocal~]#sort file(s)|uniq[rootlocal~]# sort file(s)|awk ‘Last!$0 { print }{Last$0}’ 12. 将回车字符/ 换行字符的行终结一致转换为以换行字符作为行终结可在下列方 式中选择一种: [rootlocal~]#sed –e ‘s//r$//’ file(s)[rootlocal~]#sed –e ‘s/^M$//’ file(s)[rootlocal~]# mawk ‘BEGIN {RS“/r/n} {print}’file(s) 13. 要将单空格的文本行转换为双空格的行可在下列方式选择一种 [rootlocal~]#sed –e ‘/s/$//n/ ’file(s)[rootlocal~]#awk ‘BEGTN{ ORS /n/n){print}’file(s)[rootlocal~]#awk ‘BEGIN{ ORS/n/n }1 ’ file(s)[rootlocal~]#awk {print $0 “/n”} ’ file(s)[rootlocal~]#awk ‘{print;print ” ”} ’ file(s) 13. 语句 13.1. 条件语句 if(expressionl)stateme 刀t1else if(expression2)statement2else if(expression3)statement3else if(expressionk)statementkelsestatementkl 13.2. 重复执行 awk 提供了 4 种重复执行语句 ( 循环 ): 1. 循环在起始处使用结束测试 : while(expression) statement 2. 循环在结尾处使用结束测试 : do statement while (expression) 3. 循环执行可计数的次数 : for(expr1;expr2; expr3) statement 4. 循环处理关联数组里的元素 : for(key in array) statement 例如 for name in telephone) print name“/t telephone[name] 13.3 数组成员测试 成员测试key in array 是一个表达式: 如果key 为array 的一个索引元素则计算为1( 真) 。如果key 不是array的一个索引元素则!(key in array) 为1 。 对于具有多下标(subscript) 的数组在测试时请使用圆括号并以逗点分隔下标列表:(i j …n)in array 成员测试不可能建立数组元素然而引用元素时如果元素不存在便会建立它。因此你应该这么写: if(Sally in telephone) print Sally is in the directory 而非: if (telephone[Sally]! ””) print Sally is in the directory 因为第二种形式会在她(Sally) 不存在时将其加入到目录里并拥有一个空电话号码。 重点是: 你必须能够区分寻找索引(index) 与寻找特定值(value) 的差异。索引成员测试需要固定的时间而值的查找时间是与数组里元素的个数成正比这点我们在先前已通过break 语句内的for 循环解释过了。如果你需要时常用到这两种运算那么构建反索引数组会比较实用: for (name in telephone) name_by_telephone[telephone[name]]name 接下来你就可以使用name_by_telephone [555-0136] 在一定时间内找到”Carol 。当然这里假定所有的值是唯一的: 如果这两人共享同一个电话则name_by_telephone 数组只会记录最后一个名称。只要稍做修改就能解决这个问题: for (name in telephone){if (telephone[name] in name_by_telephone)name_by_telephone[telephone[name]]/name_by_telephone [telephone[name]) “/t”namee1sename_by_telephone[telephone[name]]name 现在name_by_telephone 即包含了以制表字符分隔的具有相同电话号码的人名列表。 14. 用户控制输入 awk 也可以通过的getline 语句做这件事。getline 会返回一个值当输入被成功读取时它的返回值为I 而返回值为0 时则表示在文件结尾而-1 则表示错误。它的用法很多见表。 语法 说明getline 从当前输入文件中读取下一条记录存入$0 并更新NF, NR 与FNRgetline var 从当前输入文件中读取下一条记录存入var 并更新NR 与FNRgetlinefile 从file 文件中读取下一条记录存入$0 并更新NF, NR 与FNRgetline varfile 从file 文件中读取下一条记录存入var 并更新NF, NR 与FNRcmd|getline 从外部命令cmd 读取下一条记录存入$0 并更新NFcmd|getline var 从外部命令cmd 读取下一条记录存入var 命令管道在awk 里可以发挥强大的功能。管道可以在字符串中标明也可以包含任意的Shell 命令。这里是与getline 搭配使用如下: date I getline nowclose(date)print The current time is.now 接下来说明的是: 如何在循环里使用命令管道: commandhead -n 15 /etc/hostswhile((command I getline s)0)print sclose(command) 15. 执行外部程序 这里是解决电话名录排序问题较短的程序方案使用临时性文件与systemty 而非awk 管道: tmpfile “/tmp/telephone.tmp^for (name in telephoneprint name /t telephone[name]tmpfileclose(tmpfilejsystem(sort tmpfile “) 临时性文件必须在调用system() 之前关闭以确保任何缓冲区输出都正确地记录在文件内。 对于被system() 执行的命令并不需要调用close() 因为close() 仅针对以I/O 重定向运算符所打开的文件或管道还有getline, print 或printf 。 传递给system[f 的命令可包含数行 system(cat EOFILE/nuno/ndos/ntres/nEOFILE 它产生的输出和从嵌入文件复制到标准输出一样 Un0 das tres 16. 用户自定义函数 函数定义如下: function name(argl, }rg2, …argn { statements } 指定的参数在函数体中用来当作局部变量它们会隐藏任何相同名称的全局性变量。函数也可用于程序它处调用的形式为: name(exprl, expr2, …expn) 忽略任何的返回值 resultname(exprl, expr2, …exprn) 将返回值存储到result 中 在每个调用点上的表达式都提供初始值给函数参数型变量。以圆括号框起来的参数必须紧接于函数名称之后中间没有任何空白。 对标量参数所做的变动调用者无从得知不过对数组的变动就可看见了。换句话说标量为传值(by vaule )而数组则为传引用(by reference): 这对C 语言也是这样。 函数体里的return expression 语句会终止主体的执行并将expression 的值与控制权传给调用点。如果expression 省略则返回值由实现期定义。我们测试过的所有系统返回的不是数字零就是空字符串。 17. 字符串函数 17.1. 子字符串提取 提取子字符串的函数:substr(string, start, 1en) 会返回一份由string 的start 字符开始共len 个字符长度的子字符串副本。字符的位置从1 开始编号:substr(abcde, 2, 3) 将返回。bcd 。 len 参数可省略省略时则默认为length(string)-start1 选出字符串的剩余部分。 17.2. 字符串大小写转换 tolower(string) 会返回将所有字母改为同义的小写的string 副本而toupper(string) 则返回被改为大写字母的string 副本。所以tolower(aBcDeF123) 返回”abcdef123,toupper(aBcDeF123) 返回ABCDEF123 。 17.3. 字符串大小写转换 index(string, find) 查找string 里是否有字符串find 然后返回string 里find 字符串的起始位置如果在string 里找不到find 则返回0 。例如index(abcdef,de) 会返回4 。 17.4. 字符串匹配 match string, regexp) 将string 与正则表达式regexp 匹配如果匹配则返回 匹配string 的索引不匹配则返回0 。这种方式提供了比表达式(string~regexp) 还多的信息后者只能得到计算值1 或0 。另外match ( ) 也具有一个有用的副作用: 它会将全局变量RSTART 设为在string 中要开始匹配的索引值而将RLENGTH 设为要匹配的长度。而匹配子字符串则以substr(string, RSTART, RLENGTH) 表示。 17.5. 字符串替换 awk 在字符串替换功能上提供两个函数:sub(regexp, replacement, target) 与gsub(regexp, replacement, target), sub() 将target 与正则表达式regexp 进行匹配将最左边最长的匹配部分替换为字符串replacement。gsub() 的运行则有点类似不过它会替换所有匹配的字符串( 前置g 表示global 全局之意) 。 17.6. 字符串替换 awk 针对当前输人记录$0 自动提供了方便的分割为字1, $}, …、$NF 也可以函数来做:split(string, array, regexp) 将string 切割为片段并存储到array 里的连续元素。在数组里片段放置在匹配正则表达式regexp 的子字符串之间。如果regexp 省略则使用内建字段分隔字符FS 的当前默认值。函数会返回array 里的元素数量。 17.7. 字符串重建 join() 可确保参数数组不会被引用到除非索引是在范围之内。否则一个具有数组长度为0 的调用可能会建立arrayfl3 而修改了调用者的数组。插人的字段分隔字符为普通字符串而非正则表达式所以针对传递给split() 的一般正则表达式join() 不会重建精确的原始字符串。 17.8. 字符串格式化 最后一个与字符串相关的函数是在用户控制下格式化数字与字符串:sprintf (format,expression1, expression2,…) 它会返回已格式化的字符串作为其函数值。printf() 的运行方式也是这样只不过它会在标准输出或重定向的文件上显示格式化后的字符串而不是返回其函数值。较新的程序语言以更强大的格式化函数来取代格式控制字符串但相对而言让代码变得很冗长。按照传统的文本处理应用来说sprintf 与printf 18. 数值函数 函数 说明 atan2(y, x) y 返回y/x 的反正切值介于-pai 与pai 之间。 cos(x) 返回x 的余弦值( 以弧度(radians) 计算) 该值介于-1 与1 之间 exp(x) 返回x 的指数ex, int(x) 返回x 的整数部分截去前置的0 log(x) 返回x 的自然对数。 rand() 返回平均分布的虚拟随机r,Orl sin(x) 返回x 的正弦值( 以弧度(radians] 计算) 该值介于-1 与1 之间 sqrt(x) 返回x 的平方 srand(x) 设置虚拟随机产生器的种子为x 并返回正确的种子。如果省略x 则使用当前时间( 以秒计) 。如果。rand ( ) 未被调用则awk 在每次执行时会从相同的默认种子开始;mawk 则不会。 系统巡检脚本 [复制链接]--http://www.apelearn.com/bbs/thread-651-1-1.html 要求如下请使用vmstat采集间隔1秒连续60秒得数据汇总各项数据的平均值一并形成一个报告。 vmstat 1 60 #! /bin/bash## for vmstat 1 60 and get the average number.
## Writern by Aming.comm/usr/bin/vmstat
f1/tmp/1.txt
f2/tmp/2.txt
f3/tmp/3.txt$comm 1 60 $f1
tail -n 60 $f1 $f2
nawk {print NF} $f2 |head -n1
echo $f3
for i in seq 1 $n; do
awk BEGIN {a0}; {aa$$i};END{print a/NR} $f2 $f3
donecat $f1
echo the average number is:
echo -----------------------------------------------------------------------------------
cat $f3|xargs 删除文件的某一列不打印文件的某一列 删除文件的某一行不打印文件的某一行 比如删除第二列 赋值{$2 ;print $0} awk -F , {$2 ;print $0} 1.txt 2.txt 比如删除第二行 awk {print $$2} 1.txt
2 k 5 dfeii l 11 l 要打印一定要加BEGIN [rootsteven tmp]# awk {print \ }^C[rootsteven tmp]# awk BEGIN{print \ } 计算之后再输出 老男孩 sersync实战 echo -en $(date %H%M)\t /tmp/tmp1.log tree |wc -l /tmp/tmp1.logecho -en $(date %H%M)\t /tmp/tmp2.log tree |wc -l /tmp/tmp2.logpaste tmp1.log tmp2.log total.txtawk {if($1$3) print $1 $2 $4 (($2-$4));} total.txt cat total.txt 1134 349 1134 3501134 350 1134 451134 350 1134 451134 350 1134 45awk {if($1$3) print $1 $2 $4 (($2-$4));} total.txt1134 349 350 -11134 350 45 3051134 350 45 3051134 350 45 305 f 转载于:https://www.cnblogs.com/MYSQLZOUQI/p/5199750.html