Изменяя две строки на одной строке, совпадающие с регексом

Вместо использования Match, если вы хотите разрешить вход с одного хоста, у меня работает следующее (в sshd_config):

AllowUsers *@192.168.0.4

Это позволяет пользователям входить только с 192.168.0.4, используя любой логин на цели. Вы можете заменить * на конкретный логин, если хотите, и указать несколько шаблонов, разделенных пробелами; например:

AllowUsers user1@192.168.0.4 user2@192.168.0.4
0
12.10.2018, 12:27
2 ответа

Вы можете

awk -v newvalue=2000 '
    NR == 1 {
        for (i=1; i<=NF; i++) {
            if ($i == "foo") i_foo=i
            if ($i == "bar") i_bar=i
        }
    }
    NR == 2 {$i_foo = $i_bar = newvalue}
    {print}
' file.dat | column -t
var1  var2  var3  foo   bar
T     T     T     2000  2000

Или с менее жестким -кодированием в awk

awk -v cols="var2=1234,bar=5678" '
    BEGIN {
        n = split(cols, a, /[=,]/)
        for (i=1; i<n; i+=2) newval[a[i]] = a[i+1]
    }
    NR == 1 { for (i=1; i<=NF; i++) if ($i in newval) idx[$i] = i }
    NR == 2 { for (col in idx) $(idx[col]) = newval[col] }
    {print}
' file.dat | column -t
var1  var2  var3  foo  bar
T     1234  T     100  5678
0
28.01.2020, 04:13

Просто так:

awk -F'\t' -vOFS='\t' -vfoovalue=2101 -vbarvalue=2102 '
             /foo/&&/bar/{
                           row=NR
                           for(i=1;i<=NF;i++){
                                               if($i=="foo"){colfoo=i}
                                               if($i=="bar"){colbar=i}
                                              }
                           print
                          }
             NR==row+1{ $colfoo=foovalue; $colbar=barvalue; print }
            ' file

var1    var2    var3    foo         bar
T       T       T       2101        2102
0
28.01.2020, 04:13

Теги

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