问题描述
我有一个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
,并得到答案,告诉您使用awk
或perl
:-)。当然,您也可以使用cut
来做到这一点:
rev |cut -d' ' -f3 | rev
如果最后两个“单词”包含空格,则此操作失败。但是,perl
和awk
解决方案也是如此。