0

crawl-66-249-64-13.hero.com - - [ 17/Oct/2004:04:40:15 +0100] "GET / rubbish.txt HTTP/1.0" 200 25 "-" "Hero/2.1 ( + http://www.Hero.com/rub.html )"

粗体部分是我要提取的部分

我目前有

"^(.*) - .* \[" 

我在 grep 中使用正则表达式有人有什么想法吗?我正在使用 bash 脚本,我知道 awk 是一种很好的方法,但我希望它在一个表格中,而不仅仅是打印

4

1 回答 1

0
#!/bin/sh
var='crawl-66-249-64-13.hero.com - - [17/Oct/2004:04:40:15 +0100] "GET /rubbish.txt HTTP/1.0" 200 25 "-" "Hero/2.1 (+http://www.Hero.com/rub.html)"'
echo "${var}" | \
    sed -e 's/^\([-a-zA-Z0-9.]*\)\( - - \[\)\([A-Za-z0-9\/:]*\)\(.*GET \/\)\([A-Za-z0-9.]*\)\(.*" \)\([0-9]* [0-9]*\)\( .*\)/\1\t\3\t\5\t\7/g'

不漂亮但有效:)

Output: crawl-66-249-64-13.hero.com 17/Oct/2004:04:40:15    rubbish.txt 200 25

基本上你必须把它分解成你想要的块,然后只输出你想要的。sed 命令中的“\1”将显示第一个匹配的部分。\t 是在它们之间添加一个选项卡。更改为您想要的任何内容。您想匹配 8 个块中的项目。这就是输出为 \1\3\5\7 的原因

于 2013-04-12T18:22:21.950 回答