剪切命令以获取每行的倒数第二个单词重击

问题描述

我有一个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存储在文本文件中(该行的倒数第二个字)

我该怎么做?

解决方法

awk会更简单,并且也包含grep的使用。

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

使用此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)中,有一种方法可以在空白处分割行,并从末尾开始计数字段。

,

您问如何使用cut,并得到答案,告诉您使用awkperl :-)。当然,您也可以使用cut来做到这一点:

rev |cut -d' ' -f3 | rev

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