Фильтровать строки файла на основе количества столбцов, которые имеют =0,00000000

Вы можете подключиться к любому порту с помощью telnet, даже если за ним нет сервера telnet. Если порт ожидает, что клиент что-то отправит первым, то при подключении вы ничего не увидите, а у вас именно такая ситуация.

Таким образом, может быть запущен telnet-сервер, ожидающий ввода, может быть запущено что-то еще, или это может быть функция брандмауэра, которая просто делает вид, что вы можете к ней подключиться. По одному telnetтрудно сказать.

Если вы хотите узнать, какие возможные службы работают на неизвестном устройстве, я рекомендую проверить с помощью nmap.

0
12.05.2020, 02:33
3 ответа

Используя пробел или =в качестве разделителя полей, начните подсчет нулевых значений со столбца 7. :Если их больше одного, перейдите к следующей строке, иначе напечатайте строку.

awk -F '[= ]+' '{
    z = 0
    for (c = 7; c <= NF; c += 2)
        if ($c == 0.0 && ++z > 1)
            next
    print
}' file
2
28.04.2021, 23:15

Это самый простой способ вывести строки, которые не содержат более одного экземпляра этой строки.:

grep -v '=0\.00000000.*0\.00000000' file.txt

Поскольку в вашем файле эта строка появляется только после столбца 5, и вы хотите напечатать только те строки, где она появляется один раз или не появляется вообще, в приведенном выше примере будут напечатаны строки, в которых она не появляется более одного раза. Шаблон =0\.00000000.*0\.00000000соответствует любым двум экземплярам =0.00000000в одной строке, независимо от того, в каких столбцах они появляются, и если в любой строке есть третий, четвертый, пятый и т. д., строка не будет напечатана. Команда, которую вы пробовали, печатает любые строки, которые не содержат экземпляров этой строки, поэтому она не печатает вторую строку, а это то, чего вы не хотели.

Если вы хотите, чтобы он печатал строки, которые не содержат больше экземпляров этой строки, просто добавьте еще один .*0.00000000. Например, для печати строк, содержащих не более трех:

grep -v '=0\.00000000.*0\.00000000.*0\.00000000' file.txt

Это будет включать третью строку, содержащую три экземпляра этой строки.

1
28.04.2021, 23:15

Самое простое решение, которое мне удалось найти, это (да, это простое):

awk -F '=0\\.00000000'   'NF<=2'   file

Есть несколько возможных решений.

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

    grep -vE '^([^ ]* ){5}.*(=0\.00000000.*){2}' file
    
    • Часть ^([^ ]* ){5}будет соответствовать столбцам (, а не пробелам ), разделенным пробелами (5({5})из них ), от начала(^)строки.
    • Тогда .*(=0\.00000000.*){2}будет соответствовать как минимум двум =0\.00000000в этой строке.
    • Наконец,изменить соответствие(-v)и использовать расширенные (ERE )регулярные выражения (меньше \необходимо ).

Он будет ограничен количеством 0совпадающих с ним.

  1. Sed с похожим регулярным выражением:

    sed '/^\([^ ]* \)\{5\}.*\(=0\.00000000.*\)\{2\}/d' file
    

    но он напечатает любую строку, которая не соответствует шаблону (easy to fail положительный ).

Или

  1. Awk обрабатывает строку как текст.

    awk -F '=0\\.00000000' 'NF<=2' file
    
  2. Awk, который может анализировать числа с плавающей запятой, а затем проверять значение 0.

    Пожалуйста, используйте ответ @GlennJackman.

3
28.04.2021, 23:15

Теги

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