关于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] ]]
究竟测试什么?
1条答案
按热度按时间t98cgbkg1#
在发布这个问题后,我偶然发现了一个资源,基本上回答了如何将sed命令和通配符串在一起。
以下是他们的做法和结果。
搜索
[
之前的所有模式,并将其替换为空(删除它们),结果将是:下一个sed命令是
现在,这将搜索
]
之后的任何内容,并将其替换为空(删除它们),结果为:最后
这将搜索
:
之后的任何内容,并将其替换为空,从而导致15/Feb/2020