首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在选择行时以awk作为条件

在选择行时以awk作为条件
EN

Stack Overflow用户
提问于 2013-08-07 18:22:20
回答 1查看 111关注 0票数 1

如果标题不是最棒的,很抱歉。让我解释一下,也许这会有所帮助:

我选择了一个带有“用户代理”的行,我想取$(NF-6)和$(NF-5),但是在某些情况下,行没有那么多标记,所以我想做下面这样的操作:

代码语言:javascript
复制
if (/User-Agent/$(NF-6)>0)
    /    User-Agent/{os=$(NF-6)" "$(NF-5)}
else
    /    User-Agent/{os=$NF)}

我所使用的语法绝对是错误的:

代码语言:javascript
复制
awk: cmd. line:5:     if (/User-Agent/$(NF-6)>0)
awk: cmd. line:5:     ^ syntax error
awk: cmd. line:7:     else
awk: cmd. line:7:     ^ syntax error

如能提供任何帮助,将不胜感激!

如果有帮助的话,整个脚本:

代码语言:javascript
复制
#!/bin/bash
echo $1;
awk '
    /Internet Protocol Version 4, Src:/{ip=$(NF-4)}
    /    Time to live/{ttl++}
    /    Time to live/{sttl=$NF}
    if (/User-Agent/$(NF-6)>0)
        /    User-Agent/{os=$(NF-6)" "$(NF-5)}
    else
        /    User-Agent/{os=$NF)}
    /    User-Agent/{brow=$NF}
    /    User-Agent/{agent++}
    /    User-Agent/{stringtemp=sttl"\t"ip"\t"os"\t"brow}
    /    User-Agent/{string=(string)"\n"(stringtemp)}
    /Windows;/{windows++}
    /Linux;/{linux++}
    /Solaris;/{solaris++}
    /No.     Time        Source                Destination           Protocol Length Info/{count++}
    END{
        sub(/\\r.*$/, "", brow);
        print "("count")" > "temp";
        print "TTL\tIP\t\tOS\t\tBROWSER";
        print string;
        print "\nSUMMARY\n\tttl\t=\t"ttl"\n\twindow\t=\t"windows/2"\n\tlinux\t=\t"linux/2"\n\tsolaris\t=\t"solaris/2 >> "temp";
    }
' $1 > summary_$1;
sort -k2n summary_$1 | uniq > holder;
cat temp > useragents_$1;
cat holder >>  useragents_$1;
more useragents_$1;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-07 18:27:09

只需比较像这样的NF变量,以确保有许多字段可用:

代码语言:javascript
复制
awk '/User-Agent/ && NF > 6 {...}'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18110873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档