Использование sed или awk для фильтрации определенного шаблона? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть файл с 1000 IP-адресами в формате, после 4 октетов - порт источника, который мне нужно отфильтровать. Я немного новичок в скриптах bash, поэтому изо всех сил пытаюсь разобрать IP-адрес, фильтрующий номер порта. Будем очень благодарны за любые предложения о том, как я использовал sed или awk для фильтрации номера порта.

192.168.100.1.111  
192.168.200.10.111  
192.168.200.128.501  
192.168.150.5.300  

Требуемый выход

192.168.100.1

Ответы [ 4 ]

0 голосов
/ 27 апреля 2018

Помните, что вызов awk или sed вызывает новую программу, когда Bash уже запущен. Вместо этого вы можете отфильтровать ваш ввод непосредственно в Bash:

$ while read url; do echo ${url%.*}; done <<EOL
129.168.100.1.111
1291.168.200.10.111
EOL

129.168.100.1
1291.168.200.10

То есть

while read url
do
  echo ${url%.*}
done < urls.txt

Ссылки

Расширение параметра (см. man bash) {url%.*} использует переменную $url и удаляет (%) все, что соответствует шаблону .*. Обратите внимание, что сопоставление с образцом отличается от регулярных выражений. В частности, сопоставление с образцом имеет более простой синтаксис. То есть . соответствует буквенному символу ., а * соответствует любой строке. Сопоставление с образцом чаще всего известно для шаблонов имен файлов, как в *.txt и т. Д.

${parameter%word}
${parameter%%word}
       Remove matching suffix pattern.  The word is expanded to produce
       a pattern just as in pathname expansion.  If the pattern matches
       a  trailing portion of the expanded value of parameter, then the
       result of the expansion is the expanded value of parameter  with
       the  shortest  matching  pattern (the ``%'' case) or the longest
       matching pattern (the ``%%'' case) deleted.  If parameter  is  @
       or  *,  the  pattern  removal operation is applied to each posi-
       tional parameter in turn, and the  expansion  is  the  resultant
       list.   If  parameter is an array variable subscripted with @ or
       *, the pattern removal operation is applied to  each  member  of
       the array in turn, and the expansion is the resultant list.
0 голосов
/ 27 апреля 2018

Слишком просто.

awk -F'.' '{print $1"."$2"."$3"."$4}' < /tmp/ipaddresses.txt
0 голосов
/ 27 апреля 2018

An awk пример:

your_port=111
awk -F\. -v port=$your_port '$NF==port{$NF="";sub(/.$/, "");print}' OFS='.' file

Если вы просто хотите удалить порты:

sed 's/\.[^\.]*$//' your_file

Или в awk:

awk -F\. '{$NF="";sub(/.$/, "")}1' OFS='.' your_file

Чтобы избежать дубликатов в всего один процесс :

awk -F\. '{$NF="";sub(/.$/, "")}!a[$0]++' OFS='.' your_file
0 голосов
/ 27 апреля 2018

Вы можете сделать это с помощью следующей команды: -

sed 's/\.[^.]*$//' your_ip_address.txt > filtered_ip_address.txt

Будет удалена последняя точка вместе со следующей строкой.

Например: -

 echo 192.168.100.1.111 | sed 's/\.[^.]*$//'

Будет выводить: -

 192.168.100.1    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...