https://www.runoob.com/linux/linux-comm-awk.html
https://www.cnblogs.com/wangbaihan/p/9262296.html
https://blog.csdn.net/qq_28766327/article/details/78069989
先上语句,后面说明https://www.cnblogs.com/wangbaihan/p/9262296.html这个下面的例子,写的很好,简单明了
cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'
-F 指定分隔符,这里是正则,用”txt=" 或“&client”为分隔符,取出第二项
例子:
sdate=2017-09-20 23:59:32&txt=com.ford.fordmobile&client_id=x
被分割为
sdate=2017-09-20 23:59:32&
com.ford.fordmobile
_id=x
第二部分“com.ford.fordmobile”为需要的
cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'| sort | uniq -c | sort -nr > testfile
先排序sort
在去重统计unip:每行重复出现的次数
再次按照 -n 数值大小 -r 反向排序
> testfile 输出到文件
命令介绍:
cat
显示整个文件:cat fileName
创建一个文件:cat >fileName
合并文件:cat file1 file2 > file
参数
-n 或 -number 由1开始对all输出行数进行编号
-b or -number-nonblank 编号略过空白行,空白行不进行编号
-s or -squeeze-blank 将连续的空白行浓缩为一行
|管道
将左边命令的输出作为右边命令的输入
awk行处理器
https://www.cnblogs.com/ftl1012/p/9250541.html
文件或字符串中基于指定规则浏览、抽取信息
处理庞大文件不会内存溢出,处理较快,用于格式化文本,依次对每行文件进行处理然后输出
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数
-F fs --field-separator 指定文件分割符,fs 一个字符串或正则 -F: | |
-mf nn and -mr nn对nn值限制,mf分配最大块数目 mr记录最大目录,标准awk不适用 | |
-v var =value or --asign var=value自定义变量赋值 | |
-f scripfile or --file scriptfile脚本文件中读取awk命令 | |
-W compact or --compat,-W traditional or --traditional兼容模式下运行awk,all的awk扩展被忽略 | |
-W copyleft or --copyleft ,-W copyright or --copyright 打印简短的版权信息 | |
-W help or --help,-W usage or --usage打印全部awk选项和每个选项的简短说明 | |
-W lint or --lint 打印不能像传统unix平台移植的结构的警告 |
基本用法
我感觉直接看菜鸟教程就好,又全排版还好
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
内建变量
- awk '{print $1,$4}' log.txt 每行按空格或tab分割,输出文本中的第1、4项,0标识全部
- awk -F '[ ,]' '{print $1,$2}' log.txt 多个分隔符,先使用空格分割,再使用“,"f分割,取第1、2项
- awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt,自定义变量a, $1+a等价于$2, $1b:第一项+s
-
awk '$2 ~ /th/ {print $2,$4}' log.tx 输出第二列包含 "th",并打印第二列与第四列
- awk '$2 !~ /th/ {print $2,$4}' log.txt取反
- awk '/root/' /etc/passwd 使用pattern匹配’root'(pattern)的行才会执行,无action默认输出每行内容
- awk -F: '/root/ {print $7}' /etc/passwd 搜索/etc/passwd有root关键字all行并输出
awk
-F
":"
'{if(NR<31 && NR >12) print $1}'
/etc/passwd取第12到31行的第一列信息
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
or
awk -F: '{printf ("filename:%10s, linenumber:%3s,column:%3s,content:%3f\n",FILENAME,NR,NF,$0)}' /etc/passwd
还有常用的运算符,加减乘除、详情请移步https://www.runoob.com/linux/linux-comm-awk.html例子如下
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt 过滤第一列大于2且第二列等于Are行第1、2、3项
awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
begin放的是执行前的语句;end处理完all行后要执行的语句
https://www.runoob.com/linux/linux-comm-awk.html
sort
文件的每行作为一个单位,互相比较:从首字符向后依次按ascii码进行比较,默认升序
-b 忽略每行前开始的空格 -c检查文件是否已经按顺序排序
-d 排序时,处理英文字母、数字、空格外忽略其他字符
-f排序时小写视为大写字母 -i 排序时除040至176间ASCII字符外,忽略其他字符
-m 将几个排序号的文件合并 -M将前3个字母依照月份缩写排序
-n依照数字大小排序 -o<输出文件> 排序后结果存入指定文件
-r 相反顺序排序 -t<分割字符> 执行排序用的分隔符
uniq
报告或忽略文件中重复行,一般与sort命令结合使用
-c或--count每列旁边显示该行重复出现的次数
-d 或-repeated 仅显示重复出现的行列
-f <栏位>或-skip-fields=<栏位> 忽略比较指定的栏位
-s<字符位置>或-skip-chars=<字符位置>忽略比较指定的字符
-u或--unique仅显示一次的行列
-w<字符位置>或-check-chars=<字符位置> 指定要比较的字符
>
定向输出到文件,如果文件不存在创建,存在清空
>> 追加到目标文件
cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'
-F 指定分隔符,这里是正则,用”txt=" 或“&client”为分隔符,取出第二项
例子:
sdate=2017-09-20 23:59:32&txt=com.ford.fordmobile&client_id=x
被分割为
sdate=2017-09-20 23:59:32&
com.ford.fordmobile
_id=x
第二部分“com.ford.fordmobile”为需要的
cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'| sort | uniq -c | sort -nr > testfile
先排序sort
在去重统计unip:每行重复出现的次数
再次按照 -n 数值大小 -r 反向排序
> testfile 输出到文件