awk манипулирование файлами - PullRequest
2 голосов
/ 10 марта 2011

В моем текстовом файле есть следующие слова, и я хочу извлечь их следующим образом.

device1 te rfe3 -1     10.1.2.3   device1 te rfe3
device2 cdr thr        10.2.5.3   device2 cdr thr
device4                10.6.0.8   device4
device3 hrdnsrc dhe    10.8.3.6   device3 hrdnsrc dhe

Моя цель - извлечь имя устройства и IP-адрес, чтобы удалить все остальное. это не шаблон после имени устройства, некоторые из них имеют 2-3 слова, некоторые из них не имеют ничего. также мне не нужен 3-й столбец. Я смотрю результат как этот.

device1   10.1.2.3
device2   10.2.5.3 
device3   10.8.3.6 
device3   10.8.9.4 

это возможно? Заранее спасибо.

Ответы [ 7 ]

3 голосов
/ 10 марта 2011
 sed -r 's/^([^ ]*) .* (([0-9]{1,3}\.){3}[0-9]{1,3}).*$/\1 \2/'

Подтверждение концепции

$ sed -r 's/^([^ ]*) .* (([0-9]{1,3}\.){3}[0-9]{1,3}).*$/\1 \2/' ./infile
device1 10.1.2.3

device2 10.2.5.3

device4 10.6.0.8

device3 10.8.3.6
3 голосов
/ 10 марта 2011

в perl

perl -ne 'next if /^\s*$/ ; /^(\w+).*?(\d+(\.\d+){3})/; print "$1\t$2\n"' test_file

для отсортированных результатов вы, вероятно, могли бы передать вывод в команду сортировки

perl -ne 'next if /^\s*$/ ; /^(\w+).*?(\d+(\.\d+){3})/; print "$1\t$2\n"' test_file | sort

Обновлен скрипт, например, версия

my $test_file = shift or die "no input file provided\n";

# open a filehandle to your test file
open my $fh, '<', $test_file or die "could not open $test_file: $!\n";

while (<$fh>) {
    # ignore the blank lines
    next if /^\s*$/;

    # regex matching
    /               # regex starts
    ^               # beginning of the string
    (\w+)           # store the first word in $1
    \s+             # followed by a space
    .*?             # match anything but don't be greedy until...
    (\d+(\.\d+){3}) # expands to (\d+\.\d+\.\d+\.\d+) and stored in $2
    /x;             # regex ends 

    # print first and second match
    print "$1\t$2\n"
}
3 голосов
/ 10 марта 2011

В awk это что-то вроде

$ awk '{
         for (f = 2; f <= NF; f++) {
           if ($f ~ /^([0-9]+\.){3}[0-9]+$/) {
             print $1, $f
             break
           }
         }
       }' file

Вот расшифровка:

mress:10192 Z$ cat pffft.awk
{
  for (f = 2; f <= NF; f++) {
    if ($f ~ /^([0-9]+\.){3}[0-9]+$/) {
      print $1, $f
      break
    }
  }
}
mress:10193 Z$ cat pfft.in 
device1 te rfe3 -1     10.1.2.3   device1 te rfe3
device2 cdr thr        10.2.5.3   device2 cdr thr
device4                10.6.0.8   device4
device3 hrdnsrc dhe    10.8.3.6   device3 hrdnsrc dhe
mress:10194 Z$ awk -f pffft.awk pfft.in
device1 10.1.2.3
device2 10.2.5.3
device4 10.6.0.8
device3 10.8.3.6
mress:10195 Z$ _
1 голос
/ 24 августа 2011

Если исходный файл имеет поля, всегда выровненные по одним и тем же столбцам, самое короткое решение POSIX будет

$ cut -c1-8,23-33 x
device1  10.1.2.3

device2  10.2.5.3

device4  10.6.0.8

device3  10.8.3.6
1 голос
/ 10 марта 2011

Python отсутствует в вашем списке, но что-то вроде этого может работать.

import sys
import re
pattern= re.compile( "^(\w+)\s.*?\s(\d+\.\d+\.\d+\.\d+)\s.*$" )
for line in sys.stdin:
    match= pattern.match( line )
    sys.stdout.write( "{0} {1}".format( match.group(1), match.group(2) ) )

Он должен работать на большинстве платформ Linux, поскольку Python уже установлен.

0 голосов
/ 04 марта 2015

В качестве решения cut с perl, вы можете использовать "unpack", если файл всегда в одном и том же формате, в столбце:

perl -nE 'say unpack("A8 x14 A9")' data.txt

Или использовать регулярное выражение, чтобы получить первое слово, за которым следуетчерез пробел ^(\w+\s), а затем одну или несколько цифр после . 3 раза (\d+(\.\d+){3}):

perl -nE '/^(?<name>\w+\s).*?(?<ip>\d+(\.\d+){3})/; 
         say "$+{name} $+{ip}" '  data.txt

Именованные захваты ($+{name} $+{ip}) просто для удовольствия: -)

0 голосов
/ 10 марта 2011

В зависимости от того, насколько близко IP-номер получен кражей, это может или не может быть вашим тортиком:

sed -re 's/^([^ ]*).* ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1 \2/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...