Как указать количество цифр в awk - PullRequest
0 голосов
/ 21 февраля 2019

Мне нужно указать количество цифр в шаблоне регулярных выражений для awk

У меня есть файл:

 #test 34
 # test 34
 #test34
 # test 3a4
 #blahtest 34
 #test yes

Мне нужно возвращать результаты со значением поля, например, числом ( 34) или слово ( да ).

3a4 это неверное значение,

blahtest и test34 это неверное имя поля

Еще один пример - / etc / ssh / sshd_config .Я хотел бы найти в этом файле строку с параметром и его значением.Я не знаю это значение, пока не нашел строку с этим параметром.Тогда мне нужно изменить это значение на другое.Пример #Port 22 -> #Port <my_value> Моя логика См. Код ниже. функция get_fielad_value () имеет два аргумента: $ 1 - имя поля $ 2 - путь к файлу, в котором нужно найти.Эта функция возвращает значение поля.Я использовал awk, чтобы найти линию, соответствующую шаблону.Так что, если есть строка с неправильным значением поля?Мне нужно исправить мой шаблон.awk должен выполнять поиск не только по имени поля, но и по значениям поля.Это могут быть цифры или слова.В свете вышесказанного я должен использовать:

awk '/^# *'"$some_str"' +([[:digit:]]{1,5}|[[:alpha:]]*) {print;exit;}'

[[:digit:]]{1,5}|[[:alpha:]]* означает, что строка для поиска может содержать пятизначные (или менее) цифры ИЛИ буквы. Это мой сценарий bash.Надеюсь, это прояснит мой вопрос.

#!/bin/bash

#comment string
comment() {
    #if str1=$(awk '/^'"$1"'')
    sed -i "/^$1/ c# $1" $2
}

#uncomment string
uncomment() {

    if str1=$(awk '/^# *'"$1"' +/ {gsub(/^#|^# +/,""); print; exit;}' $2)
    then
        sed -i "s/^#\+ *$str1/$str1/" $2
    fi
}

#get field value
get_field_value() {
    FIELD_VALUE=$(awk '/^# *'"$1"' +/ {gsub(/^#|^# +/,""); print $2;exit;}' $2)
}

#set field
set_field_value(){
    get_field_value $1 $2

}

#replace field
replace_field(){
    sed "s/$1/$2/g"
}

set_field_value test test 777
uncomment test test

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы ищете что-то подобное?

awk -v keyname="$somestring" '$0 ~ "^ *# *" keyname " +([[:digit:]]{1,5}|[[:alpha:]]+)($|[[:space:]] )"'

С somestring="test" он вернет следующие строки из вашего образца:

 #test 34
 # test 34
 #test yes

Ваше регулярное выражение не будет разрешать пробелы раньше # но я настроил регулярное выражение, чтобы разрешить это, а также ограничить контекст после последней цифры / альфа-группы (в противном случае он просто посмотрел бы на строку альфа и прекратил сопоставление, но принял бы ее, как только увидел цифру после буквыв последнем поле).

Для некоторых действительно старых реализаций Awk попробуйте

awk -v keyname="$somestring" '$0 ~ "^ *# *" keyname " +([0-9]([0-9]([0-9]([0-9][0-9]?)?)?)?|[A-Za-z]+)($|[ \t])"'
0 голосов
/ 21 февраля 2019

Вам не нужны регулярные выражения.Попробуйте это:

awk '{if ($1 == 1 || $1 == 2 || $1 == 6) print $0}' filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...