Парсинг columnized данные

Теперь существует дополнительный KeeFox для Firefox для Linux.

Должен установить все моно пакеты:

aptitude install mono-complete

Необходимо загрузить последний совместимый с Версией Linux Дополнения KeePass FireFox.

Необходимо будет установить PassiFox для FireFox и KeePassHttp для KeePass для соединения KeeFox и KeePass (Который является странным, но он работает).

Настройте KeeFox с каталогом к плагину KeePassRPC.

/usr/lib/keepass2/plugins

и dir установки KeePass2

/usr/bin

4
13.06.2013, 01:52
3 ответа

Настоящая проблема здесь состоит в том, что количество столбцов не равно. У Вас есть некоторые строки с шестью столбцами и некоторые с восемь.

Таким образом, то, что необходимо сделать, должно добавить пустой x-th и y-th поле, где они отсутствуют (X и Y могли бы быть 5 и 6, или возможно 3 и 4).

Вы могли сделать это как это:

F="\\(\\S\\S*\\)\\s*\\s"
# This is 0160, a nonbreaking space
G=" "

| sed -e "s/^$F$F$F$F$F$F*$/\\1 \\2 \\3 \\4 \\5 $G $G \\6/g" \
| column -t

sed отождествляет те строки только с шестью полями и добавляет два дополнительных поля в соответствующих случаях. С вышеупомянутым я добираюсь

all  tcp  117.54.56.131:80     <-  10.42.100.211:63752     ESTABLISHED:ESTABLISHED
all  tcp  10.42.120.201:63752  ->  219.224.67.112:31180  ->  137.51.59.141:80  ESTABLISHED:ESTABLISHED
all  tcp  77.221.237.24:443    <-  10.42.100.117:59999     ESTABLISHED:ESTABLISHED
2
27.01.2020, 20:52
  • 1
    Спасибо, я чувствую, что это - самый нормальный ответ, хотя все еще не совершенно счастливый этим. Я предполагаю, что должен быть способ сместить только последний столбец. –  atx 23.06.2013, 07:19

РЕДАКТИРОВАНИЕ 1:

Один путь мог быть чем-то как:

getStats | grep ESTABLISHED | column -t | sed \
-e 's/\(<-\|->\)[ ]\+/\1 /g' \
-e 's/[ ]\+\([^ ]\+$\)/\t\1/' | column -t -s "   "
                                               ^--- TAB
all  tcp  117.54.56.131:80     <- 10.42.100.211:63752                        ESTABLISHED:ESTABLISHED
all  tcp  10.42.120.201:63752  -> 219.224.67.112:31180  -> 137.51.59.141:80  ESTABLISHED:ESTABLISHED
all  tcp  77.221.237.24:443    <- 10.42.100.117:59999                        ESTABLISHED:ESTABLISHED

Сначала использование column -t затем удаляя все последовательные пробелы после <- и -> с одним пространством, затем разделяя последний столбец с tab и выполнение нового column -t -s '<TAB>'

Если на командной строке: -s "Ctrl+VTAB" (иначе. tab) как разделитель для column. Дополнительно используйте tr заменять вкладки для пробелов сначала.

Установка sed к одному op и пропуску grep и некоторые другие модификации:

getStats | column -t | \
sed '/ESTABLISHED/!d;s/\(<-\|->\) */\1  /g;s/ *\([^ ]*\)$/\t \1/' | \
column -t -s "    "
                ^--- TAB

РЕДАКТИРОВАНИЕ 2:

Даже при том, что Вы находите awk и printf грязный я даю это как опцию. С этим сценарием можно вместо этого сказать:

getStats | scrip_name ESTABLISHED

Одним преимуществом является гибкость для настройки и т.д.

Любой способ, которым смотрит на него, нужно или проанализировать данные дважды или сохранить meta о данных и печати в конце.

Короче говоря то, что это делает:

  • Запишите максимальную ширину каждого столбца.
  • Рекордное максимальное количество столбцов.
  • Сохраните каждое поле к мудрому строкой массиву.
  • В конце печатают каждое поле, но в последний раз использование макс. ширины для того столбца.
  • Заливка до максимальных столбцов - 1 с пробелами.
  • Печать последнее поле.

(Разделение между awk -v pat="$1" ' и отдых кода происходит только из-за пользовательского, выделяют HTML-comment на этой странице),

#!/bin/bash

# Argument 1 is what to match against.
awk -v pat="$1" '
# Iff match pat.
$0 ~ pat {
    # Highest number of columns.
    if (NF > cols)
        cols = NF
    # Increment number of lines.
    ++nl
    # Number of fileds on this line.
    lines[nl] = NF

    for (i = 1; i <= NF; ++i) {
        # IFF not last field and 
        # width of field is > current width of column, store it in wc_a.
        if (i < NF && (wc = length($i)) > wc_a[i])
            wc_a[i] = wc
        # Save columns in array lines[LINE COLUMN]=FIELD_DATA.
        lines[nl,i] = $i
    }
}

END {
    # Loop lines.
    for (i = 1; i <= nl; ++i) {
        # Print all but last.
        for (j = 1; j < lines[i]; ++j)
            printf("%-*s ", wc_a[j], lines[i,j])
        # Print "missing" columns.
        for (; j < cols; ++j)
            printf("%-*s ", wc_a[j], "")
        # Print last column field.
        printf("%s\n", lines[i,lines[i]])
    }
}
' "$2"
# $2 is either file or empty: expect pipe.

СТАРЫЙ:

Удаленный и найденный здесь.

3
27.01.2020, 20:52
  • 1
    Ваш первый пример работает вполне прилично, но не сокращает его: columnizing все еще должен относиться к другим полям, особенно IP-адреса. –  atx 12.06.2013, 09:41
  • 2
    @atx: Да. Я неправильно истолковал, "По существу я хочу выровнять по правому краю просто последний столбец". А-ч –  Runium 12.06.2013, 09:57
  • 3
    , моя ошибка. Я отредактировал сообщение. –  atx 12.06.2013, 09:59
  • 4
    Хотя, если бы, огромные данные, я использовал бы некоторый другой язык. Быстрый тест на 74M файл: grep передается по каналу к C: 2 секунды, awk: 27 секунд, sed + столбец: 70 секунд. –  Runium 16.06.2013, 15:01

Вот немного сценария Perl для выполнения то, что Вы хотите:

$ getStats | grep ESTABLISHED | \
perl -ne '
chomp @a;
@a = split(" ",$_);
map { print "$_," } @a[0..4];
if ($a[5] !~ m/>/) {
  map { print " , ,$_," } @a[5..$#a];
  print "\n";
} else {
  map { print "$_," } @a[5..$#a];
  print "\n";
}
' | column -t -s ','

Результаты в этом выводе:

all  tcp  117.54.56.131:80     <-  10.42.100.211:63752                         ESTABLISHED:ESTABLISHED
all  tcp  10.42.120.201:63752  ->  219.224.67.112:31180  ->  137.51.59.141:80  ESTABLISHED:ESTABLISHED
all  tcp  77.221.237.24:443    <-  10.42.100.117:59999                         ESTABLISHED:ESTABLISHED

Я проявил немного отличающийся подход с Вашим column -t и измененный мой вывод Perl так, чтобы это представило запятую"", между каждым полем. Так вывод, прежде чем 'команда столбца похожа на это:

all,tcp,117.54.56.131:80,<-,10.42.100.211:63752, , ,ESTABLISHED:ESTABLISHED,
all,tcp,10.42.120.201:63752,->,219.224.67.112:31180,->,137.51.59.141:80,ESTABLISHED:ESTABLISHED,
all,tcp,77.221.237.24:443,<-,10.42.100.117:59999, , ,ESTABLISHED:ESTABLISHED,

column -t -s ',' затем коаксильные кабели column разделять на символах разделителя вместо этого, которые я нахожу легче иметь дело с затем просто пробелом.

Введение запятых на каждую строку чувствует немного hacky мне, но это делает задание, это могло, вероятно, быть оптимизировано далее, но это - рабочее решение.

1
27.01.2020, 20:52

Теги

Похожие вопросы