【问题标题】:Cut command to get second last word in each line | bash剪切命令以获取每行中的倒数第二个单词 |重击
【发布时间】:2021-02-07 14:00:02
【问题描述】:

我有一个 bash 脚本,我在其中使用 grep 来获取包含特定日期的每一行:

(grep -h "$date" $1) > requests.txt

一个示例行是..

95.81.72.148 - - [22/Jan/2019:08:01:41 +0330] "GET /image/5384/productModel/100x100 HTTP/1.1" 200 2280 "https://link" "Mozilla/5.0 (Windows NT 6.1; rv:60.0) IPADRESS Firefox/60.0" "-"

但是我想使用管道和切割以某种方式仅将每一行的 IPADRESS 存储在文本文件中(该行中倒数第二个单词)

我该怎么做?

【问题讨论】:

  • 该行倒数第二个单词是Firefox/60.0",最后一个单词是"-"

标签: bash unix awk cut


【解决方案1】:

awk 会更简单,它也包含了grep 的使用。

awk -v d="$date" '$0 ~ d { print $(NF - 2) }' "$1" > requests.txt

【讨论】:

    【解决方案2】:

    使用这个 Perl 单行,它打印从末尾开始计数的第 3 个字段(最后一个字段是 $F[-1]):

    perl -lane 'print $F[-3]'
    

    例子:

    echo '95.81.72.148 - - [22/Jan/2019:08:01:41 +0330] "GET /image/5384/productModel/100x100 HTTP/1.1" 200 2280 "https://link" "Mozilla/5.0 (Windows NT 6.1; rv:60.0) IPADRESS Firefox/60.0" "-"' | \
      perl -lane 'print $F[-3]'
    

    输出:

    IPADRESS
    
    

    Perl 单行程序使用这些命令行标志:
    -e:告诉 Perl 查找内联代码,而不是在文件中。
    -n:循环输入一行一次,默认将其分配给$_
    -l:在执行内联代码之前剥离输入行分隔符(默认为 *NIX 上的"\n"),并在打印时附加它。-a : 在空格或-F 选项中指定的正则表达式上将$_ 拆分为数组@F

    另请参阅:
    perldoc perlrun: how to execute the Perl interpreter: command line switches


    顺便说一句,cut 不是此任务的正确工具,因为在cut 中,字段从头开始编号。同时,在许多脚本语言中,例如 Perl 和 awk,有一种方法可以在空白处分割行,并从开始 结束计算字段。

    【讨论】:

      【解决方案3】:

      您询问如何使用 cut 进行操作,您得到的答案告诉您使用 awkperl :-)。当然你也可以使用cut 来做到这一点:

      rev |cut -d' ' -f3 | rev
      

      如果最后两个“单词”包含空格,则会失败。但是,perlawk 解决方案也是如此。

      【讨论】:

        猜你喜欢
        • 2013-07-12
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多