我对 bash 很陌生,我有一个任务,必须创建一个脚本来读取 url 并提取 http 代码、使用的编码和字数。除了字数之外,一切都运行良好:我测试了该命令,它在隔离时可以工作,但是当我将它存储在变量中并将其添加到回显末尾时,它似乎将自身插入到“http”的位置?更奇怪的是,对于一个 URL,它可以工作并显示在最后。我真的很迷失,我一直在试图理解出了什么问题,我确信答案是愚蠢而简单的,但我似乎不明白为什么。有人可以向我解释一下我做错了什么吗?
这是我的代码,我有一个变量“count”,它存储 wc 命令的结果。当我尝试使用一个网址隔离它时,它会起作用并显示数字。
#!/usr/bin/env bash
if [ $# -ne 1 ]
then
echo "Le script demande un argument"
exit 1
fi
urls=$1
if ! [[ $urls =~ ".txt"$ ]]
then
echo "Ce n'est pas un format valide"
exit 2
fi
i=1
while read -r line
do
code=$(curl -ILs "$line" | grep "HTTP/" | cut -d' ' -f2)
charset=$(curl -ILs "$line" | grep -i "Content-Type:" | cut -d" " -f3 | cut -d"=" -f2)
if [ -z "$charset" ]
then
charset="null"
fi
count=$(lynx "$line" -dump -nolist | wc -w)
printf '%s\t%s\t%s\t%s\t\n' "$line" "$code" "$charset" "$count"
i=$((i + 1))
done < "$urls"
这是我得到的:
1 6401 ://fr.wikipedia.org/wiki/Robot 200 UTF-8
2 1171 ://fr.wikipedia.org/wiki/Robot_de_cuisine 200 UTF-8
3 1730 ://fr.wikipedia.org/wiki/Robot_d%27indexation 200 UTF-8
4 2278 ://fr.wikipedia.org/wiki/Bot_informatique 200 UTF-8
5 1157 ://fr.wikipedia.org/wiki/Atlas_(robot) 200 UTF-8
6 https://roboty.magistry.fr 200 null 35
7 1618 ://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci) 200 UTF-8
8 4525 ://fr.wiktionary.org/wiki/robot 200 UTF-8
9 1048 ://fr.wikipedia.org/wiki/Protocole_d%27exclusion_des_robots 200 UTF-8
10 12985 //fr.wikipedia.org/wiki/Robotique 200 UTF-8
我希望插入到 url 中的数字(如 6401)位于末尾,就像第 6 行一样。
这是
bash -x
日志:
+ urls=./urls/fr.txt
+ [[ ./urls/fr.txt =~ \.txt$ ]]
+ i=1
+ read -r line
++ curl -ILs https://roboty.magistry.fr
++ grep HTTP/
++ cut '-d ' -f2
+ code=200
++ curl -ILs https://roboty.magistry.fr
++ grep -i Content-Type:
++ cut '-d ' -f3
++ cut -d= -f2
+ charset=
+ '[' -z '' ']'
+ charset=null
++ lynx https://roboty.magistry.fr -dump -nolist
++ wc -w
+ count=35
+ printf '%s\t%s\t%s\t%s\t\n' https://roboty.magistry.fr 200 null 35
https://roboty.magistry.fr 200 null 35
+ i=2
+ read -r line
++ curl -ILs 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)'
++ grep HTTP/
++ cut '-d ' -f2
+ code=200
++ curl -ILs 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)'
++ grep -i Content-Type:
++ cut '-d ' -f3
++ cut -d= -f2
+ charset=$'UTF-8\r'
+ '[' -z $'UTF-8\r' ']'
++ lynx 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)' -dump -nolist
++ wc -w
+ count=1618
+ printf '%s\t%s\t%s\t%s\t\n' 'https://fr.wikipedia.org/wiki/Robot_(Léonard_de_Vinci)' 200 $'UTF-8\r' 1618
https://1618ikipedia.org/wiki/Robot_(Léonard_de_Vinci) 200 UTF-8
+ i=3
+ read -r line
我想这是因为 在“UTF-8”末尾?
如果您能帮助我,请先非常感谢
你只需要清理新的行字符和类似的东西,这是我快速整理的更新版本。
#!/usr/bin/env bash
# Check if exactly one argument is provided
if [ "$#" -ne 1 ]; then
echo "Le script demande un argument"
exit 1
fi
urls_file="$1"
# Check if the provided argument is a .txt file
if [[ "$urls_file" != *.txt ]]; then
echo "Ce n'est pas un format valide"
exit 2
fi
# Check if the file exists and is readable
if [ ! -r "$urls_file" ]; then
echo "Erreur : Le fichier '$urls_file' n'existe pas ou n'est pas lisible."
exit 3
fi
# Initialize a counter (optional if tracking line numbers)
i=1
# Process each URL in the file
while IFS= read -r url ;do
#while read -r url; do
# Skip empty lines
if [ -z "${url}" ]; then
continue
fi
# Get the HTTP status code
code=$(curl -ILs "${url}" | grep -m 1 "HTTP/" | awk '{print $2}' | sed 's/[^0-9]//g')
if [ -z "$code" ]; then
code="null"
fi
# Get the charset from the Content-Type header
charset="$(curl -ILs "${url}" | grep -i "Content-Type:" | cut -d':' -f2 | awk '{print $1}' | sed 's/[^a-zA-Z0-9:\/ ]//g' | tr -d '\n\r')"
if [ -z "$charset" ]; then
charset="null"
fi
# Count words on the page content using curl and wc
count=$(curl -s "${url}" | wc -w | sed 's/[^0-9]//g')
if [ -z "$count" ]; then
count="null" # Handle cases where curl fails to retrieve content
fi
# Print results in a tab-separated format
echo "${url} $code $charset $count"
# Increment the counter (optional)
i=$((i + 1))
done < "$urls_file"
** 快速讨论:**
错误检查:
文本文件检查应该更加稳健,如果失败,我添加了一个附加检查,错误代码为 3。此外,您应该检查结果,如果失败,则应填充“null”字符串或“NA”等。您还应该跳过空行,我是用“继续”执行的。
变量命名:
还要处理变量命名,它应该尽可能地描述事物(例如 urls_file 是更好的描述)。
简化命令:
你不应该需要 lynx 来获得字数统计,我不知道你得到的字数统计是什么,所以我假设它是所有文本,而不仅仅是用户会看到的 html 单词。