2016-12-11 4 views
0

Я делаю сценарий IP Подробности для моей школы, но я обнаружил ошибку ...Первая буква строки не появляющаяся

Это мой код:

State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | cut -c42-999 | 
grep '</li>' | grep 'e : ' -B 1 | awk '{gsub("</li>", "");print}' | 
sed 's/[0-9]*//g' | awk '{gsub("e :", "");print}') 
echo $State 

Я из Австралии, Новый Южный Уэльс, но сценарий только говорит

ew South Wales 

Любая помощь была бы принята с благодарностью!

+1

Часть проблемы заключается в том, что ваш вывод содержит невидимые символы, включая возврат каретки (который заставляет его вернуться к началу строки, а затем есть пробел, который перезаписывает «N» ...). Попробуйте 'echo '$ State" | cat -vet', чтобы увидеть невидимые (возврат каретки будет отображаться как «^ M»). –

ответ

2

Вы можете использовать hxpipe от W3C HTML-XML-utils (для различных операционных систем, например html-xml-utils для Ubuntu). hxpipe превращает HTML во что-то синтаксическое разбор с инструментами командной строки.

Пример:

curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe | grep 'State/Province/' 
-State/Province : Ontario 

Это гораздо проще для дальнейшей обработки, например, с AWK, чтобы получить все после двоеточия:

$ curl -s http://www.ipinfodb.com/my_ip_location.php | hxpipe | 
awk -F" *: *" '/State\/Province/ {print $NF}' 
Ontario 

Это говорит AWK, что поля разделены двоеточием, окруженный любым количеством пространств. Сама команда выбирает строки, которые соответствуют State/Province (как и команда grep в первом примере), а затем печатает последнее поле этой строки.

0

Учитывая вывод, что HTTP URI, как представляется сложным HTML с линией, как:

<21 spaces><li>State/Province : Western Australia</li> 

Я не могу на самом деле увидеть, как что трубопровод будет работать даже дал вам, кажется, отрезав "State/Province : " (и, возможно, W (N в вашем случае)), прежде чем вы даже начнете поиск строк, содержащих "e :".

Вам было бы намного лучше извлечь правильную строку сначала, а затем просто захватить соответствующий текст с помощью более адаптивной команды, чем cut.

Что-то, как это должно быть хорошее начало:

curl -s http://www.ipinfodb.com/my_ip_location.php 
    | awk '$1 == "<li>State/Province" && $2 == ":" { 
       $1 = ""; 
       $2 = ""; 
       gsub ("</li>", ""); 
       print 
      } 
      {}' 
    | sed 's/^ *//' 

awk является одного команда, которая будет выбирать строки, в которых первые два столбца соответствуют тому, что вам нужно, установите эти столбцы пустые строки, удалить конечный тег </li> и выводят результат.

sed будет просто удалять ведущие пространства из-за того, что awk по-прежнему будет выводить пробелы между пустыми столбцами в начале.

Таким образом, вам не нужно беспокоиться о незначительных вариациях в линейном формате, если, например, они начинают вкладывать больше пробелов или отступать от вкладок, а не пробелов. Вам все равно придется беспокоиться об изменении основных изменений, таких как изменение "State/Province" бит, но они должны быть гораздо менее вероятными.

0

sed, как правило, не является хорошим инструментом для анализа HTML, но он может помочь в этом простом случае.Попробуйте это:

State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | sed -n 's/.*<li>State\/Province : \([^<]*\)<\/li>.*/\1/p') 

В строке State/Province появляется только один раз на странице, это один должен работать тоже:

State=$(curl -s http://www.ipinfodb.com/my_ip_location.php | sed -n 's/.*State\/Province : \([^<]*\)<.*/\1/p') 
Смежные вопросы