本贴专门解答awk相关的计算问题,每周1至周5回答
awk吧
全部回复
仅看楼主
level 10
lpicjj
楼主
如题
2013年05月23日 03点05分
1
level 6
xiaobailc
cat /data1/apache2/logs/access_log|awk'{if($(NF-1)>0) print $4}'|awk -F':' '{print $1 ":" $2":" $3 "]"}'|sort|uniq -c
这样统计apache日志,每分钟超时的访问数,怎么样,求大神评价一二;
2013年05月24日 03点05分
3
xiaobailc
回复 lpicjj :嗯~好的~~
2013年05月27日 08点05分
level 1
Amanda4D
怎么看不到你的回复了呢?你删了?
2013年05月29日 14点05分
4
lpicjj
那个太多了,下面系统给隐藏了,而且学分页了,
2013年05月29日 14点05分
level 1
Amanda4D
怎么把两个文本合并成一个喃?我用NR,FNR来做,貌似不得行
2013年05月30日 02点05分
5
level 1
Amanda4D
哦,我已经合并成功了,呵呵,但是问题是现在想把方差算出来后方在$7列,求助~
2013年05月30日 02点05分
6
lpicjj
算出来后 print $0,t 然后前面就是原来的6列,t就在第7列
2013年05月30日 09点05分
level 1
Amanda4D
我又来了,呵呵,我想判断一个文本,如果$2>500,则判断是否($4-$2)/$2 >50%,如果是的话,就调用Wiondows里面的一个音乐文件a,不是的话,直接跳过,检查下一行。如果$2在100~500,则判断是否$4/$2>3,如果是的话,就调用Wiondows里面的一个音乐文件b,不是的话,直接跳过,检查下一行。我肯定$2的数据肯定在这个假设条件范围内~
请问这个应该怎么做啊
2013年06月04日 11点06分
7
lpicjj
用system函数调用外部命令,在window下调用一个.bat文件,这个bat文件就是调用音乐文件的命令,如system("/data0/app.sh") 这种方式,注意路径什么的,还有一个就是不能肯定要wins 下system是否好使,在linux下是没有问题的
2013年06月04日 12点06分
lpicjj
如果调用音乐文件比较简单的话,可以在system函数直接定相关的命令就可,调用bat文件的话,就是比较好隔离两个过程,对后期比较容易修改
2013年06月04日 12点06分
Amanda4D
回复 lpicjj :我是这么写的awk "if($2>500&&($4-$2)/$2>50%){getline<\"a.rmv\";print $0}else if($2>100&&$2<500&&($4/$2)>3){getline<\"a.rmv\";print $0}" data.txt>result.txt 我的想法是调用音乐文件的同时,把满足条件的那一行输出到新文件中
2013年06月05日 05点06分
Amanda4D
但是我执行的时候提示出错,说print $0有问题,还有else if,好奇怪啊
2013年06月05日 05点06分
level 10
lpicjj
楼主
{
if($2>500&&($4-$2)/$2>50%){
getline d<\"a.rmv\";print d // 这里用$0 会让程序造成误会,所以加了一个d,也是geline的一种用法
}else{
//todo
}
}
2013年06月06日 11点06分
8
Amanda4D
但是你这里的d就两种情况塞,要么1要么0,我是想把满足条件的那一行输出到一个新文本中,同时对满足条件的调用a.rmv的文件
2013年06月07日 05点06分
lpicjj
回复 Amanda4D :这个d就是一个参数了,可以进行各种运算了,
2013年06月07日 07点06分
Amanda4D
这个地方不对喃?我调用了声音文件后,没办法播放呢》
2013年06月19日 12点06分
lpicjj
回复 Amanda4D :那就是播放文件的一段程序,直接调用应该是能播的,应该调用播放器的exe文件去执行声音文件
2013年06月20日 09点06分
level 10
lpicjj
楼主
2013年06月06日 11点06分
9
level 1
Amanda4D
我先把问题简单话,只做第一个,满足条件的输出到新的文件中。我是把写的命令保存成.bat的文件,然后运行。
awk "{if($2>500&&($4-$2)>0.5){print $0}else{($2<500&&$2>100&&$4/$2>3){print $0}}}" data.txt>result.txt
但是提示syn error
2013年06月07日 05点06分
10
level 1
Amanda4D
哦,我弄出来了,但是有遇到一个疑问,呵呵,先把我改好了的写这
awk "{if($2>500&&($4-$2)>0.5){print $0}else if{($2<500&&$2>100&&$4/$2>3){print $0}}END{print \"finish\"}" data.txt>result.txt
但是新的问题是$4-$2很有可能为负数,我想取绝对值怎么弄啊?
2013年06月07日 06点06分
11
level 1
Amanda4D
哦,呵呵,我又晓得了,用selector ? if-true-exp : if-false-exp 可以
2013年06月07日 06点06分
12
lpicjj
呵呵, awk没有取绝对值的函数,用那个三目运算符进行判断是可行的,
2013年06月07日 07点06分
Amanda4D
回复 lpicjj :呵呵,我整个系统弄的差不多了,现在已经用py2exe转成exe可执行文件了,但是我还想更美化下,坐成一个对话框的形式,然后把我做的几个模块融合到一起,有什么好意见没啊?
2013年06月08日 03点06分
level 1
魔界小兵1
我碰到了这样的情况,一个文本以\t字符串为分隔的,如下
2013-07-01 23:59:58\thttp://\t8f563deba1
15c71958824
ed1089da7b8\tapp\t\t3.3.1\t3958
我想用awk取其中的一些,这样写awk -F\t '{print
$1,$2}' mobile_search_log20130702|head得到
2013-07-01 23:59:58\ h
这样写awk -F\\t
'{print $1}' mobile_search_log20130702|head得到还是全的,即没有找到这个分隔符
这样写awk -F'\t'
'{print $1}' mobile_search_log20130702|head也是得到全的
这样写awk -F'\\t'
'{print $1}' mobile_search_log20130702|head还是得到全的
2013年07月04日 02点07分
15
lpicjj
请使用双引号来包含分隔符,或者不要-F参数,缺省分隔符就是tab或空格
2013年07月05日 01点07分
level 1
舒畅且透彻丶好汉0t
本人新手,不了解脚本的排序语法,我想在一个脚本中按照第5个字段的数值大小进行逆向排序排序,可是运行如下代码之后输出结果并没有排序,求高手指教!
#!/usr/bin/awk -f
BEGIN {
FS="|"
}
{
if(($1=="1"||$1=="2")&&($3=="1"||$3=="3"||$3=="4"))
print $5,"|",$1,"|",$2,"|",$3,"|",$4,"|">"screen.txt"
sort -rn;
}
END {
}
2013年07月08日 02点07分
16
lpicjj
见你的主题贴,给你回复了
2013年07月08日 05点07分
level 1
Av__AnGus
楼主好,我是小白。现在有两个文件,每个文件中的记录都有5个域,现在需要找到两个文件中特定3个域相同的记录,应该怎么实现。
2015年07月17日 03点07分
17
lpicjj
用数组可简单的实现,把两个文件读入,要相同的域名做主键,把相同的写入到数组里,遍历数组就OK了,不过得加上相关文件的行数,便于查找,当NR==FNR的时候,就明就是第一个文件, 如: $3,4,5为指定的域 ,每个用逗号隔开{result[$3$4$5] = result[$3$4$5] ","NR,FNR,$0} END{遍历打出来}
2015年07月24日 06点07分
level 1
469203356xzh
有一个文件:
sdflksjdfskld.23 120.210.180.16
sdflksjdfskld.23 120.210.180.18
sdflksjdfskld.23 120.210.180.17
然后有一个./ipjudge 120.34.342.43 可以输出ip地址所在位置
求问如何在上面的文件ip地址后面一行添加使用ipjudge输出后的位置的信息?
2015年08月28日 07点08分
18
lpicjj
cat file |awk '{cmd="./ipjudge "$2 ;cmd|getline result; print $0,result }'
2015年09月06日 07点09分
lpicjj
用cmd|getline方法有一个问题,参数不能一样,一样直接用上次的结果, 也可以用system(cmd),执行,这个会正常执行,但问题是结果不捕捉,会直接打出来, 你可以这样试下,cat file |awk '{cmd="./ipjudge "$2 ;system(cmd); print $0}' ,最后打出来的结果是sh执行的在里面$0在后面
2015年09月06日 10点09分
level 1
723191032
1 2 3 4 5,6,7 9 10
每排如上第五列中用,隔开的
求显示 1 6
怎么写?
为什么awk ‘{awk...}’不可以
那该怎么办??
2015年12月11日 10点12分
19
lpicjj
不知求1.6是什么意思,但至少要加上分隔标志,-F','
2015年12月13日 09点12分
level 1
小西瓜的妈
配置文件如下
……多个段
[ss1]
test=aaa
[ss2]
……多个配置项
test=aaa
……多个配置项
[ss3]
test=aaa
需求:搜索[ss2]段,修改这个段下test=aaa为mmm=bbb
2016年01月21日 12点01分
20
lpicjj
这个用sed等其他比较好,真要awk就一行一行判断是否到了s2处,到了后做个标记,然后再一行一行读到test替换,判定这个test是否你要的就看是否有标记,
2016年01月22日 15点01分
level 1
empㄒy
我想显示出所有的端口和后面所连接的IP地址(红的部分)。
如图所示,如果有相同的端口,相同的IP。只用显示一个就行了。
50211 113.76.26.159
如果同个端口,有多个IP,多个IP要显示出来
例:
相同的端口 IP地址1
相同的端口 IP地址2
拜谢。
2016年01月29日 12点01分
21
lpicjj
Netstat -n|grep tcp|awk -F":" '{print $2}' |sort luniq -c|awk '{print $2,$3,$1}'|sort -n
2016年01月30日 14点01分
lpicjj
回复 lpicjj :结果是 端口 ip 统计数
2016年01月30日 14点01分
lpicjj
回复 lpicjj :后是竖,我打成L 了
2016年02月02日 09点02分
level 1
empㄒy
本人在网上找到这句代码
netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("\n%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'|sort -rn
您看看,但是有个bug,就是只能显示所有的IP,不能按端口显示IP,一下是截图。
2016年01月29日 12点01分
22
empㄒy
如果可以加个按端口排列IP,就完美了
2016年01月29日 12点01分
level 1
empㄒy
大牛帮我看看,貌似弹错了。
2016年01月31日 12点01分
23
lpicjj
我用爪机打错了,那个sort | uniq -c 这里是 一竖,你打成L 了
2016年02月02日 09点02分
1
2
尾页