@WillireamAngel
2018-08-13T06:48:28.000000Z
字数 5846
阅读 1696
Linux
组成:模式+操作
awk适用于文本处理和报表生成,对输入的文本执行行操作,每行执行代码块操作。
基本格式:
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s) -f文件为awk程序
awk 'bool{action}' file
运行脚本用''
表示,代码块用{}
表示,其中的一些纯文本块用""
打印,默认分隔符,
表示空格。
转换:
数字转字符串:+连接,非数字的第一个字符及以后均忽略,非数字值为0
字符串转数字:""连接变量运算
对于无文件只做打印操作的时候,可以使用echo | awk
的方式传给awk文件
$0
当前记录$1-$n
当前记录的第n个字段awk -F [[:space:]+] [" ":]+ ":"
$NF 最后一个值
cat /etc/passwd|awk '{FS=":"} $3<10 {print $1 "\t" $3}' #第一行不会正确执行,因为读入第一行时,分隔符还是tab,
cat /etc/passwd|awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'
赋值:
= += -= *= /= %= ^=(或**=)
逻辑运算:
|| &&
正则匹配:
~ !~
关系运算符:
< <= > >= != == #字符串比较按照ASCII码比较
算术运算符:
* / & 乘除求余
+ - !
^ *** 幂运算
++ -- #操作数转换为数值,非数值变为0,第一个非数值及以后均消失None
root@WA:awk 'BEGIN{a="20b4";print a++,++a}'
20 22
其它运算符:
$ 引用
空格 子串链接符
?: 三目运算符 #表达式1 ? 表达式2 : 表达式3,表达式1成立则执行表达式2,否则执行表达式3
in 数组中是否存在某键值
\a 响铃
\b 退格(Backspace)
\f 换页
\n 换行
\r 回车
\t TAB
\v 垂直制表
\0 NULL
awk '/expression/{action}' file
^ 头
$ 尾
. 任单字符
* 匹配0个或多个前导字符
+ 匹配1个或多个前导字符
? 匹配0个或1个前导字符
[] 匹配指定字符组中的任意一个
[^] 匹配不在指定字符组中的任意一个
() 子表达式
| 或
\ 转义
~,!~ 匹配/不匹配
x{m,n} 重复m到n次
{
if(){
}
}
{
do{
}while()
}
awk的数组都是关联数组,数字索引会转变为字符串索引。
for...in...输出无序关联数组。
统计数组:
查看服务器连接状态并汇总:
netstat -an | awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'
查看web日志访问流量并输出访问次数,请求页面或图片,每个请求的总大小。
awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],x,a[x]}|"sort -rn -k1";print"total size is :"total}' /app/lpg/access_log
常见函数:
gsub(Ere,Repl,[in]) #查找[in]中,匹配Ere,替换为Repl
sub(Ere,Repl,[in])
index(string1,string2) #查找
match(string,Ere) #正则匹配查找
length[(string)]
blength[(string)]
substr(string,M,[N]) #截取string中M到N的字符
split(string,A,[Ere]) #以[Ere]为分隔符(未指定则使用FS),分隔元素为A数组中元素,可使用A[n]来读取元素
tolower(string) #大写变小写
toupper(string) #小写变大写
sprintf(format,Expr,Expr,...) #格式化
printf(format,Expr,Expr,...) #格式化打印输出
system() #调用linux系统命令
getline #输出重定向
awk 'BEGIN{info="this is sensphone8";gsub(/[0-9]+/,"ok",info);print info}'
awk 'BEGIN{info="this is sensphone8";print index(info,"is")?"ok":"no"}'
match:
awk 'BEGIN{info="this is sensphone8";print match(info,/is/)?"ok":"no"}'
截取:
awk 'BEGIN{info="this is sensphone8";print substr(info,4,10)}'
分隔:
echo | awk 'BEGIN{info="this is sensphone8";split(info,ta," ");print length(ta);for(k in ta){print k,ta[k]}}'
3
1 this
2 is
3 sensphone8
格式化:
awk 'BEGIN{info="this is sensphone8";print sprintf("%d",info)}'
#如何把一行竖排的数据转换成横排?
awk '{printf("%s ",$1)}' filename
输出重定向:
seq 10 | awk '{getline; print $0}' #偶数
seq 10 | awk '{print $0; getline}' #奇数
seq 10 | awk '{getline tmp; print tmp; print $0}' #先偶后奇
awk '{printf "%s ", $0; getline < "b.txt"; print $0}' a.txt #先打印a.txt再打印b.txt
awk 'BEGIN {"date" | getline; close("date"); print $0}' #执行UNIX命令并返回值
getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。
常用格式替换符:
格式化字符 | 含义 |
---|---|
%s | 字符串 |
%f | 浮点格式 |
%c | ASCII字符,即显示对应参数的第一个字符 |
%d,%i | 十进制整数 |
%o | 八进制值 |
%u | 不带正负号的十进制值 |
%x | 十六进制值(a-f) |
%X | 十六进制值(A-F) |
%% | 表示%本身 |
sed是一款非交互式编辑器,所有编辑文件都存在临时缓存区中,处理完成一行文本便打印输出,处理完最后一行后便退出,一般对源文件无影响。
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使用。
sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。
基本语法:
sed [option] 'command' flie
sed -n 2~5p
表示从第2行开始,每隔五行匹配一次。5,~4
就是匹配5到8行。
^
$
.
*
[]
[^]
\(..\) #保存已匹配的字符
& #保存查找串以便在替换串中引用
\< 词首定位符
\> 词尾定位符
x\{m,n\} 连续
sed -nefri 动作
-n 只显示被处理的行
-e 直接在命令行进行动作编辑,允许操作多个动作,命令顺序会影响结果
--expression= 方法使用优于-e
-f 执行filename中的动作
-r 支持扩展型正则
-i 直接修改文件内容,不输出到屏幕(此时需要添加-i才会对源文件进行修改)
可加/**/设置匹配项,不加nefri,直接加文件,
sed命令:
i\在当前行之前插入文本
a\当前行后添加一行或多行
c\新文本替换当前行的文本
d删除行
h模式空间文件内容复制到暂存缓冲区
H模式空间文件内容追加到暂存缓冲区
g取出暂存缓冲区里的内容,复制到模式空间,覆盖原有内容
G取出暂存缓冲区里的内容,复制到模式空间,追加原有内容
I列出非打印字符
p打印行
n读入下一行,并从下一条命令(非第一条命令)开始处理
q结束或退出sed
r从文件中读入行
!对所选行以外的所有行应用命令
s用一个字符串替换另一个
替换标志:
g在行内进行全局替换
p打印行
w将行写入文件
x交换暂存缓冲区与模式空间的内容
y将字符转换为另一字符(不能应用于正则表达式)
sed会输出简单的错误信息,如果无法判断错误信息,会“断章取义”,没有语法错误,sed会输出退出状态码,0为正常运行。
行的范围从一个地址开始到另一个地址结束,可使用N,M,也可以使用/text1/,/text2/,也可以二者混用。所有的匹配行均满足最短匹配原则。
- sed -n '3,5p' flie
- sed -n '3,/text1/p' flie
- sed -n '3,/test1/s/text1/text2/' flie
对3行到test1行的所有行进行替换操作
grep
文件搜索打印
grep -acinv --color=auto '关键字' filename
命令格式:
grep [选项] 模式 文件
grep查找成功会返回相应的查找行,退出状态0;如果没找到,退出状态1;如果找不到指定文件 ,退出状态2。
^
$
.
*
[]
[^]
\(..\)
&
\<
\>
x\{m,n\}
-E grep -E = egrep
-i 忽略大小写
-w 把表达式作为一个完整的词来查找"\<...\>"
-x 被匹配的内容正好是整个行"^...$"
-v 反向查找
-c count统计匹配结果的行数
-m 匹配规定的行数
-n 显示输出结果在原文件中的行号
-o 只显示匹配内容
-R 递归匹配,匹配一个目录的多个文件或者多个目录
-B 输出满足条件的前几行
-A 输出满足条件的后几行
-C -B -A 同时输出前后n行
-I 只输出包含模式的文件名
egrep
增加更多元字符
正则:
^
$
.
*
[]
[^]
#新增
+ 匹配1个或多个前导字符
? 匹配0个或1个前导字符
a|b 匹配a或b #grep不支持|
() 匹配字符组
#不包含\{\}或\(\)