unix sed的/.*\[//g;在这里工作

xeufq47z  于 2022-11-23  发布在  Unix
关注(0)|答案(1)|浏览(188)

关于sed的问题。
使用此命令sed 's/.*\[//g;s/].*//g;s/:.*//g'
有了这个输入

172.19.0.100 - - [16/Feb/2020:22:31:32 +0000] "GET /site HTTP/1.1" 200 36565 "https://command-not-found.com/curl" "Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)" "172.19.0.3"
172.19.0.101 - - [16/Feb/2020:22:30:10 +0000] "GET /credits HTTP/1.1" 200 31067 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "172.19.0.2"
172.19.0.102 - - [17/Feb/2020:22:30:10 +0000] "GET /index HTTP/1.1" 200 31067 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "172.19.0.2"
172.19.0.100 - - [18/Feb/2020:22:35:10 +0000] "GET /index HTTP/1.1" 200 31067 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" "172.19.0.2"

有人能一步一步地告诉我sed是做什么的吗?我正在努力更熟练地使用它,这对我来说有点难以承受
预期结果
我试着在https://sed.js.org/上玩它,但它一直说文件无法读取。
我想读懂的代码是这样的。

#!/usr/bin/env bash
LOG_FILE="$1"

function request_per_day() {
    declare -A day_array
    while read line; do
        day=$(echo "$line" | sed 's/.*\[//g;s/].*//g;s/:.*//g')
        if [[ -v day_array[$day] ]]; then
            day_array[$day]=$((day_array[$day]+1))
        else
            day_array[$day]=1
        fi
    done < $LOG_FILE

    for day in ${!day_array[@]}; do echo ${day_array[$day]} $day; done | sort -rn | head -10
}

function request_per_ip() {
    declare -A ip_array
    while read line; do
        ip=$(echo $line | awk '{print $1}')
        if [[ -v ip_array[$ip] ]]; then
            ip_array[$ip]=$((ip_array[$ip]+1))
        else
            ip_array[$ip]=1
        fi
    done < $LOG_FILE

    for ip in ${!ip_array[@]}; do echo ${ip_array[$ip]} $ip; done | sort -rn | head -10
}

request_per_day
echo ""
request_per_ip

虽然我理解了其中的大部分内容,但我真的不明白sed和awk在这个示例中是如何工作的。
最后,这个if [[ -v day_array[$day] ]]究竟测试什么?

t98cgbkg

t98cgbkg1#

在发布这个问题后,我偶然发现了一个资源,基本上回答了如何将sed命令和通配符串在一起。
以下是他们的做法和结果。

s/.*[//g

搜索[之前的所有模式,并将其替换为空(删除它们),结果将是:

15/Feb/2020:22:32:02 +0000] "GET /index HTTP/1.1" 200 14034 "-" "Mozilla/5.0 (compatible; SemrushBot/6~bl; +http://www.semrush.com/bot.html)" "172.19.0.4"

下一个sed命令是

s/].*/g

现在,这将搜索]之后的任何内容,并将其替换为空(删除它们),结果为:

15/Feb/2020:22:32:02 +0000

最后

s/:.*//g

这将搜索:之后的任何内容,并将其替换为空,从而导致
15/Feb/2020

相关问题