如何指定awk中的位数

时间:2019-02-21 12:05:30

标签: bash awk

我需要在awk的regexp模式中指定位数

我有一个文件:

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

我需要返回带有数字( 34 )或单词()之类的字段值的结果。

3a4 ,它是不正确的值

最荒谬的 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 :(得分:0)

您不需要正则表达式。试试这个:

awk '{if ($1 == 1 || $1 == 2 || $1 == 6) print $0}' filename

答案 1 :(得分:0)

您是否正在寻找类似的东西?

std

使用awk -v keyname="$somestring" '$0 ~ "^ *# *" keyname " +([[:digit:]]{1,5}|[[:alpha:]]+)($|[[:space:]] )"' ,它将从您的示例中返回这些行:

somestring="test"

您的正则表达式不允许在 #test 34 # test 34 #test yes 之前使用空格,但是我对正则表达式进行了调整,以允许这样做,并限制了最后一位数字/字母组之后的上下文(否则它将仅查看字母字符串并停止匹配但只要在最后一个字段的字母后面看到一个数字,就接受它。

对于某些非常老的Awk实现,请尝试

#