对比文件内容

需求从A文件当中查找不存在B文件当中的内容

方案1、

diff -B a.txt b.txt |awk '/</{print $2}'

#如果文件过大diff会超出内存就没法玩了~

方案2、

sort a.txt b.txt b.txt | uniq -u > c.txt
#排序并去重

方案3、

awk '{if(ARGIND==1) {val[$0]}else{if($0 in val)  delete val[$0]}}END{for(i in val) print i}'  a.txt b.txt > c.txt

其他命令参考:

#拆分文件
split -l 5000000 -d -a 3 c.txt
将c.txt按照每个文件500w行拆分,后缀是数字,并且后缀长度是3

AWK第二课

1、工作原理
例子:
cat /etc/passwd |awk -F ‘:’ ‘BEGIN {print “name”} {print $1} END {print “Joyous”}’
说明:
awk是先执行BEGIN,然后去读文件,一行一行读取,-F指定了每行按照:分割,其中$0标示当前行,$1标示分割第一个区域,$n标示第n个区域。一直到读取完毕,最后执行END
2、正则匹配
awk -F: ‘/^root/{print $1}’ /etc/passwd
说明:搜索root开头的行打印第一个区域
3、内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
示例:
awk -F’:’ ‘{print “filename:” FILENAME “,line:” NR “,cols:” NF}’ /etc/passwd
4、printf格式化输出
awk -F ‘:’ ‘{printf(“filename:%s,linenumber:%s,columns:%s,linecontent:%s\n”,FILENAME,NR,NF,$0)}’ /etc/passwd
5、编程
定义变量可以在action块定义,语句使用;分开
awk ‘BEGIN {count=0;} {count++; print $0;} END{print “user count is “, count}’ /etc/passwd
条件语句if(){}else{}
6、函数
length(string)返回字符串的长度
index(string,find)返回子字符串在父字符串位置
tolower(string)将所有字符都转成小写
toupper(string)将所有字符都转成大写
substr(string,strat,length)截取字符串
match(string,ereg)支持正则匹配
sub(reg,rep,string)替换匹配的第一个字符序列
gsub(reg,rep,string)替换匹配的全部字符序列
split(string,arr,char)分割字符

参考:
http://www.gnu.org/software/gawk/manual/gawk.html

awk第二课

使用方法:awk ‘{pattern + action}’ {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

1.命令行执行:awk [-F field-separator] ‘commands’ input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

2.shell脚本方式 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。 相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk

3.将所有的awk命令插入一个单独文件,然后调用: awk -f awk-script-file input-file(s) 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

更多链接:[学习]  [http://bbs.chinaunix.net/linux/awkminglingxiangjie.shtml]

 

awk开学了

查找访问ip列表

awk ‘{print $1}’ log_file|sort|uniq

查看ip访问文件总数

awk ‘{++S[$1]} END {for(a in S) print a,S[a]}’ log_file

查看ip访问的文件列表

grep ^127.0.0.1 log_file |awk ‘{print $1,$7}’

查看2015年6月2日,16点访问网站的ip

awk ‘{print $1,$4}’ /var/www/log/access.log |grep 02/Jun/2015:16 |awk ‘{print $1}’|sort|uniq

查看访问前10的ip地址

cat /var/www/log/access.log |awk ‘{print $1}’|sort |uniq -c |sort -nr |head -10

访问文件统计

cat /var/www/log/access.log |awk ‘{counts[$(11)]++};END {for (url in counts) print counts[url], url}’

统计网站流量

cat /var/www/log/access.log |awk ‘{sum+=$10} END {print sum/1024/1024/1024}’

每秒并发

cat /var/www/log/access.log  |awk ‘{if ($9 ~/200|30|404/COUNT[$4]++)}END{for(a in COUNT) print a,COUNT[a]}’|sort -k 2 -nr|head -n 10