У меня есть файл, содержащий список URL-адресов формы
РЕДАКТИРОВАТЬ
http://www.google.com/absd/siidfs/kfd837382 $% ^ $ &,
www.google.com,
- Создание дополнительного скрипта копирования и вставки
- компиляция оболочки nginx не выполняется
- Как избежать метасимволов оболочки с помощью команды `find`?
- Программно / динамически настраивать сеанс сеанса SSH
- Отмена выхода и возврат в оболочку
google.com
yahoo.com/list/page/jhfjkshdjf …
Я хочу написать сценарий, который отобразит следующий вывод
google.com : 2 http://www.google.com: 1 yahoo.com : 1
Я застрял с частью, которую мне нужно прочитать URL-адреса из файла, и снова проверить весь файл. Я новичок в написании сценариев bash, и поэтому я не знаю, как это сделать.
Предполагая следующий формат ввода:
http://www.google.com, www.google.com, google.com yahoo.com
Результат выглядит следующим образом:
google.com : 3 yahoo.com : 1
Трудно определить всю ситуацию, в которой вы находитесь, но учитывая результат, который вы показываете нам, я бы склонен сначала преобразовать входной файл, чтобы все строки имели форму:
google.com google.com google.com yahoo.com
Затем запустите этот файл с помощью следующего набора команд:
$ grep -v "^$" data.txt | \ sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \ sort | uniq -c 3 google.com 1 yahoo.com
Вы можете очистить формат вывода, чтобы он соответствовал тому, что вы хотите:
$ grep -v "^$" data.txt | \ sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \ sort | uniq -c | \ awk '{printf "%s : %s\n", $1, $2}' google.com : 3 yahoo.com : 1
У ОП был следующий вопрос, в котором он изменил исходные данные в примере. Поэтому, чтобы подсчитать этот тип ввода:
http://www.google.com/absd/siidfs/kfd837382$%^$&, www.google.com, google.com yahoo.com/list/page/jhfjkshdjf...
Вы можете использовать этот адаптированный однострочный слой из первого примера:
$ grep -v "^$" data2.txt | \ sed -e 's/,$//' \ -e 's#\(http://[^/]\+\).*#\1#' \ -e '/^[^http]/ s/^www\.//' \ -e '/^[^http]/ s#\([^/]\+\).*$#\1#' | \ sort | uniq -c | \ awk '{printf "%s : %s\n", $1, $2}' 2 : google.com 1 : http://www.google.com 1 : yahoo.com
Вероятно, вы захотите использовать sort
и uniq -c
для правильного подсчета, а затем используйте sed
или awk
для окончательного форматирования. Что-то вроде этого:
sort file | uniq -c | awk '{printf "%s : %s\n", $1, $2}'
На ваш исходный вопрос, вероятно, можно было бы ответить одним и тем же основным конвейером, но сначала отредактировать вход:
sed -e 's/http:\/\///' -e 's/^www\.//' file | sort | uniq -c | awk '{printf "%s : %s\n", $1, $2}'
Если это не совсем правильно, вы можете возиться с командами sed
и awk
чтобы получить правильные формы имен хостов и формат вывода. Например, чтобы очистить правую сторону от более длинных URL-адресов:
sed -e 's/http:\/\///' -e 's/^www\.//' -e 's/\/..*$//' file | sort | uniq -c | awk '{printf "%s : %s\n", $1, $2}'