列表:
Linux笔记——命令:Sort,uniq,join,cut,paste,split
Linux笔记——shell基础:变量&本地变量&位置变量&特定变量参数
鉴于博客,表格&排版&颜色标记等等无法显示,大家可以下载这个笔记的资源
12个文档,不需要积分,以目录+表格+颜色标记形式
下载资源地址http://download.youkuaiyun.com/detail/wklken/3815477
The end! Thx! wklken的笔记
-----------------------------------------------
命令:awk
AWK: 三位创造者Aho、Weinberger和Kernighan统称 |
定位:AWK 是一种用于处理文本的编程语言工具,主要用于格式化报文或从一个大的文本文件中抽取数据。提取原来文本中行的某些域进行计算组合显示,出结果 【扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。】 [Shell过滤工具中最难掌握的,语法复杂,错误提示不明确] |
格式: |
语法组成:awk 'pattern + {action}' 输入文件 【注意,pattern在非括号中,用于查询筛选匹配行,action在括号中,用于对筛选后的内容进行处理 就是 查找 -à 执行处理】 其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。 awk [ -F re] [parameter...] ['prog'] [-f progfile] |
参数说明: |
-F re:允许awk更改其字段分隔符,默认空格。 parameter: 该参数帮助为不同的变量赋值。 'prog': awk的程序语句段。这个语句段必须用单拓号:'和'括起,以防被shell解释。 -f progfile:允许awk调用并执行progfile指定有程序文件。progfile是一个文本文件,他必须符合awk的语法。 in_file:awk的输入文件,awk允许对多个输入文件进行处理。值得注意的是awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。 |
调用方式: |
1. 命令行 2. 写入脚本文件,并在首行加入#!/bin/awk –f ,执行之 3. 所有awk插入一个单独文件然后调用 awk –f awk-script-file input-files awk脚本由各种操作和模式组成,每次读取一条记录或一行,处理之,直到文件末尾。 |
错误排查 |
在碰到awk错误时,可从下面几个方面查找: 确保整个awk命令用单引号括起来。 确保命令内所有引号成对出现。 确保用花括号括起动作语句,用圆括号括起条件语句。 |
模式和动作
模式部分决定了动作语句何时触发及触发的事件【处理语句】
模式部分可省略,则动作对每一行执行;模式部分可以是任何条件语句、复合语句、正则表达式。
BEGIN部分:设置计数和打印头
END部分:打印输出文本总数及结尾状态标识。
假设数据文件:data.txt
M.T 05/9948311 Green 8 40 44
域的切分: |
A#B#C#D 分隔符为#,则 域1:A 域2:B ……注意,所有域为 $0 【print隶属于action,所以一定要放在{}中】 |
示例: |
1. 打印所有行 awk ‘{print $0}’ data.txt 2. 打印所有第二个字段 awk ‘{print $2}’ data.txt 3. 打印第一个和最后一个字段 awk ‘{print $1,$7}’ data.txt 4. 打印包含报头 awk ‘BEGIN{print “NAME AGE”}{print $1,$7}’ data.txt 5. 打印包含尾部 awk ‘BEGIN{print “NAME AGE”}{print $1,$7} END{print “END_OF_REPORT”}’ data.txt 加入条件操作 < <= > >= == != ~匹配正则 !~不匹配正则 【if必包含在{}中】 6. 打印最后一个域为44的 awk ‘$7==”44” {print $0}’ data.txt 7. 打印第四个字段为G开头的 awk ‘{if($4 ~/G*/) print $0} data.txt 8. 打印第四字段非Brown的 awk ‘{if($4 !~/Brown/) print $0}’ data.txt 9. 比较最后两个字段符合的 awk ‘{if($6 < $7) print $0 “ABC”}’ data.txt 10.多条件 && || ! awk ‘{if($1 == “A” && $2==”B”) print $0}’ data.txt |
awk内置变量 | |
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | 实际操作的文件名 |
FNR | 浏览文件记录数,<=NR |
FS | 设置输入域分隔符,等价于命令行-F选项 Field Separator 可在BEGIN中进行设置,然后执行的时候均以设置的符号为分隔符 |
NF | 浏览记录 域的个数,在记录被读取时设置【number of fields】一共有多少个域 |
NR | 已读取记录数【number of rows】 1 2 3 4 ….. |
RS | 控制记录分隔符,缺省:新行\n Row Separator记录分隔符 可以根据具体数据需求,设置读取一条记录的区间 |
OFS | 输出域的分隔符,缺省空格 输出结果 print $1,$2默认加的是空格,可以在BEGIN中设置,改为其他分隔符 |
ORS | 输出记录的分隔符,缺省:新行\n 整体记录的 |
注:可以在BEGIN中配置FS,OFS,RS,ORS已决定输入输出的分隔符【域和行的】 | |
示例: | |
11.打印文件记录数 awk ‘END{print NR}’ data.txt 12.打印每行记录数,已读记录数,记录内容 awk ‘{print NF,NR,$0} END{print FILENAME}’ data.txt 13.打印当前所在文件夹 echo $PWD | awk –F / ‘{print $NF}’ 可以设置域变量及进行域值比较 14.设置输入域到域变量名 awk ‘{name=$1;belts=$4;if(belts ~/Yellow/) print name}’ data.txt 注:设置了 变量直接输出就是了,不需要使用$进行获取,否则拿不到东西,懂? 15.域值比较 awk ‘{if($6<27) print $0}’ data.txt 16.设置对所有记录有效的全局域变量【全局变量放在BEGIN中】 awk ‘BEGIN{LINE=”27”}{if($6<LINE) print $0}’ data.txt 修改域值【对原文件无影响】 17.修改域值 awk ‘{if($1==”MT”) $6=$6-1;print $1,$6,$7}’ data.txt 【if($1==”MT”) $6=$6-1;符合才执行,其他行都执行print $1,$6,$7】 18.赋新值 awk ‘{if($1==”MT”) $1=”AB”;print $1}’ data.txt 19.打印每一列并进行了统计 awk ‘(tot+=$6);END{print tot}’ data.txt 20.只进行统计 awk ‘{(tot+=$6)};END{print tot}’ data.txt |
使用内置的字符串函数 | |
gsub(r,s) | 在整个$0中用s代替r |
gsub(r,s,t) | 在整个t中用s替代r |
index(s,t) | 返回s中字符串t的第一位置 |
length(s) | 返回s长度 |
match(s,r) | 测试s是否包含匹配r的字符串 |
split(s,a,fs) | 在fs上将s分成序列a.fs为分隔符 |
sprint(fmt,exp) | 返回经fmt格式化后的exp |
sub(r,s) | 用$0中最左边最长的子串代替s |
substr(s,p) | 返回字符串s中从p开始的后缀部分 |
substr(s,p,n) | 返回字符串s中从p开始长度为n的后缀部分 |
注意:字符串一定要用双引号括起来,否则当做变量解释,找不到即为空,变成了用空值作了原字符串 | |
示例: | |
21.替换一个字符为另一个 awk ‘gsub(/4842/,4899){print $0}’ data.txt 替换字符串必须加双引号,否则当做变量处理,取到值为空,导致空值替换掉现有的东西 $awk –F : ‘gsub(/Mike/,”KEN”){print $0}’ data 只打印出存在替换操作的行 $awk –F : ‘{ gsub(/Mike/,”KEN”);print $0}’ data 打印出所有行,无论是否替换 22.字符串中出现的第一位置 awk ‘{print index($0,”e”)}’ data.txt 23.长度 awk ‘{print length($0)}’ data.txt 24.匹配 awk ‘BEGIN{print match(“ANCD”,/D/)}’ 返回结果4,即开始下标 若不匹配,返回0 25.切分 awk ‘BEGIN{split(“1#2#3”,myarray,”#”);print length(myarray)}’ $awk ‘BEGIN{STR=”1#2#3”;split(STR,myarray,”#”)}{for(x in myarray){print myarray[x]}}’ 26.发现并替换 awk ‘sub(/26/,”29”,$0)’ data.txt 27.截取字符串 awk ‘BEGIN{print substr(“abcdefg”,1,3)}’ |
awk使用printf进行格式化输出
【注意要自己换行,\n】
%c | ASCII字符 |
%d | 整数 |
%e | 浮点数,可科学计数法 |
%f | 浮点数,小数形式 |
%g | 由awk决定使用哪种浮点数转换e或f |
%o | 八进制 |
%s | 字符串 |
%x | 十六进制 |
示例 | |
28.字符串转换 echo “65”| awk ‘{printf “%c\n”,$0 }’ 将输出A 29.格式化输出 awk ‘{printf ‘%-15s %s \n’,$1,$3}’ data.txt 左对齐十五个字符等长 参数及脚本 |
其他示例: |
30.向一行awk传递参数 awk ‘{if($5<AGE) print $0}’ AGE=10 data.txt awk –v AGE=10 ‘{if($5<AGE) print $0}’ data.txt 31.awk脚本文件 stu.awk !/bin/awk –f BEGIN{ print”ABC” print “DEF” } {total+=56} END{ print “Total” total print “AVG” total/WR } 32.awk中数组的使用 awk ‘BEGIN{split(“1#2#3”,myarray,”#”);for(I in myarray){print myarray[i]}}’ 33.增加一个域【原来只有11个域】 awk ‘{$12=”AAA”;print $0}’ data 则显示结果中自动多了一个域 34.自动连接字符串 awk ‘{print “hello”,”there”,”Jim”}’ 打印 hello there Jim 【补充Additional:】 修改文本域 awk '{if($1=="M.Tansley") $1="feidd";print $0}' awk.txt 只显示修改的记录 awk ‘{if($1==“M.Tansley”) {$1=“feidd”;print $0}}’ awk.txt(区分和修改文本域的区别) 列转化成行 每四列转换成一行 awk '{if (NR%4==0){print $0} else {printf"%s ",$0}}' auction.xml 行转换成列 awk 'BEGIN {RS="^A"} {print $0}' 1 awk ‘{(tot+=$6)};END {print tot}’ awk.txt(只打印tot值) awk ‘(tot+=$6);END {print $0“\n”tot}’ awk.txt(打印所有域) 练习 将ls –l 存储到一个文件 1. 输出内容中文件夹的列表 2. 输出文件大小在某一范围内的文件 |
补充: |
A. Awk中的循环 x=1 while(x<NF){ print $x “\t” x++ if(x == 2) { break } } count=1 do{ print “” }while(count != 1) for(x = 1 ; x<=4 ; x++) { Print “interation”,x } |
B. 数组 BEGIN{ myarray[0] = “jim” myarray[2] = 456 } for(x in myarray) { print myarray[x] } awk -v b=$line 'BEGIN {split(b,array,"^B")} END {for(i in array) {print array[i]}}' |
C. awk中引号的使用 $awk –F : ‘BEGIN{NAME=”123131”}{print NAME}’ data 打印 123131 $awk –F : ‘BEGIN{NAME=”123131”}{print $NAME}’ data 什么都不打印 $awk –F : ‘BEGIN{NAME=”123131”}{print ‘$NAME’}’ data 打印出所有行,应该是$NAME 变成 $0了 $awk –F : ‘BEGIN{NAME=”123131”}{print “$NAME”}’ data 打印出$NAME |
D. awk中另外一种设置变量的方法 awk –v NAME=123 ‘{print NAME}’ |
E. Awk 变量内置变量 1 直接引用,不加$($NF) 自定义变量 1 用户自定义(不要与内置变量冲突) 2 直接引用,不加$ 3 不需要对变量进行初始化 (默认其为字符串类型 ) |
F. 流程控制: 1 if(){….}else{if()….} 2 while语句 3 do-while语句 4 for(;;){….} 5 exit; (不在END中,文件尾;END中,程序结束) break(中断当前正在执行的循环并跳到循环外执行下一条语句); continue(从当前位置跳到循环开始处执行 ) |
G. BEGIN{….}{…..}END{……} 1 位置:’{}’ 2 作用:BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作 BEGIN{}:awk开始扫描输入之前执行 (显示变量和预置(初始化)变量 ) END{}:在扫描完全部的输入之后执行 (最终结果 ) {}:操作 |
H. Awk 自定义函数 定义方法如下: function 函数名(参数表){ 函数体 } 直接调用,但不执行参数有效性检查 (多余的参数会被awk所忽略,而不足的参数,awk将它们置为缺省值0或空字符串 ) 返回值:return 返回值 |
I. Awk与SHELL交互 awk读取Shell script程序变量 :$变量(类SHELL变量) 将shell命令的执行结果送给awk处理 : s=`du -k ./diff" | awk '{ print $1 }'` shell script程序读awk的执行结果 :`` .在awk中执行shell命令行 :嵌入函数system() END{print count;system("ls ./");} |