Grep для строки, содержащей только 5 или 6 чисел

Я сделал немного раскопок и нашел, что Ваш ноутбук имеет дефект от производителя (микросхема NVIDIA, конкретно), и единственное решение состоит в том, чтобы сделать "обратное течение", как объяснено здесь.

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

О неспособности выполнить pwmconfig, BIOS не включает (из документации HP) метода для ручного изменения скорости вентилятора, следовательно pwmconfig сбои, поскольку нет никакого модуля, который позволяет управление этим, оценивает.

Для других ноутбуков я рекомендую проверить Ваше руководство/спецификации и видеть, включают ли они поддержку этого модули. Рабочие датчики - обнаруживают, не собирается причинять боль, если Вы не уверены, или Ваша документация не включают информацию. Также помните, что иногда Linux не включает модули, даже если Ваша машина включает поддержку, таким образом, необходимо держать себя в курсе с последними выпусками ядер и молиться.

5
04.12.2014, 10:27
7 ответов
grep -E '^(\s*[0-9]+\s+){4,5}[0-9]+\s*$'
2
27.01.2020, 20:32

А путь с awk, который настраиваем для различных чисел полей.
Также пробел не имеет значения.

awk 'NF~/^(5|6)$/{x=0;for(i=1;i<=NF;i++)x+=($i~/^[0-9]+$/)}x==NF' file

Это проверяет, что количество полей равняется 5 или 6, хотя больше чисел полей могло быть добавлено, если ваши требования когда-нибудь изменяются.

Затем это устанавливает в противоречии с 0

Затем циклы, проверяющие, что каждое поле является числом и если это, добавляет 1 к счетчику

, Если счетчик равняется количеству полей, это печатает строку.

пример

ввел

  1       2       3       4       5        6
        2       3       4       5        6
3       4       5        6
blah  1       2       3       4       5
      4       3324       4       53        6

, производит

  1       2       3       4       5        6
        2       3       4       5        6
      4       3324       4       53        6
0
27.01.2020, 20:32

grep -e '[0-9] {5}' ищет цифры с не менее 5 цифр. То, что вам нужно, это 5 номеров с хотя бы одной цифрой:

grep -E '[0-9]+([^0-9]+[0-9]+){4}'
  • [0-9] + - ряд, по меньшей мере, одной цифры
  • [^ 0-9] + [0-9] + - число, по меньшей мере, одной цифрой, предшествующему, по меньшей мере, один незначный символ. Затем мы повторим это 4 раза, чтобы получить 5 номеров, разделенных незначающими.
  • Если требование имеет ровно 5, вы можете окружить это регулярное выражение [^ 0-9] , чтобы вся линией соответствовала (с якорями, конечно).
  • В зависимости от того, что вы хотите здесь (это 1,2,3,4,6 квалификация?) Вы можете посмотреть на другие сепараторы. Например, правильная научная нотация реального числа будет выглядеть так: [+ -]? (([0-9] + (\. [0-9] +)?) | ([0-9]? \ , [0-9] +)) ([EE] [+ -] [0-9] +)? Таким образом, разделители могут не включать . , E E и т. Д. Они могут быть только пробелами, как Mikeserv Notes. Или они, возможно, запяты, если это запись CSV. Или в зависимости от локали запятая будет десятичный разделитель. Варьироваться [^ 0-9] согласно вашим потребностям.
7
27.01.2020, 20:32

Я бы выбрал что-нибудь более мощное, чем grep . Это можно сделать с помощью perl:

perl -ne 'print if s/\d+/$&/g == 5' your_file

Регекс-замена заменяет все группы одной или нескольких цифр (\d+) на себя ($&): это ничего не делает. Используется просто для побочного эффекта, так как оператор s/// возвращает количество раз, которое ему удалось заменить на свой регекс. Таким образом, строка выводится только в том случае, если s/// нашли 5 групп цифр.

2
27.01.2020, 20:32

Другой perl:

$ perl -MList::Util=first -Tnle '
  s/^\s+|\s+$//g;
  @e = split /\s+/;
  print if @e == 5 || @e == 6 and !first {/\D/} @e;
' file
10      2       12      1       13

Объяснение

  • s/^\s+|\s+$/g обрезает линию.

  • @e = split /\s+/ split the line into array @e.

  • Мы выведем строку, если:

    • массив @e содержит 5 или 6 элементов.
    • И ни один из его элементов не содержит нецифровых символов (\D совпадает с нецифровыми символами).
2
27.01.2020, 20:32
awk '{l=$0; n = gsub(/[0-9]+/, "", l)}; n == 5 || n == 6' 

(тот же принцип, что и в ответе Джозефа )

.
2
27.01.2020, 20:32

Я знаю, что не решил, используя sed или awk или любую из команд shell, однако tcl все же получилось хорошо.

Я сохранил сценарий простым и удобным для пользователя. Такие элементы как 4a abc и т.д. будут учтены

command

script.tcl file

Script

#!/usr/bin/tclsh

if {$argv == ""} {
        puts "please enter the arguement"
        exit ;
}

set tar_fl [lindex $argv 0]
if {![file exists $tar_fl]} {
        puts "$tar_fl doesnot exist"
        exit ;
}

set flptr [open $tar_fl r]

while {[gets $flptr line] >=0 } {
        if {[llength $line] !=5} {continue ;}
        if {[llength $line ] == 5} {
                if {[lsearch -regexp  $line {[^0-9]}]> -1} {continue;}
                puts $line
        }

}

close $flptr

Output

           10      2       12      1       13
1       2       3       4       5
0
27.01.2020, 20:32

Теги

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