шаблон поиска в конкретном поле и замена его содержимого - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно найти пустое поле пароля с пробелом или символом табуляции и заменить его на x (в файле / etc / passwd)

Я нашел этот синтаксис с помощью awk, который показывает, что пользователи на втором местеполе (с использованием: в качестве разделителя) либо пустое, либо содержит пробел или табуляцию внутри:

awk -F":" '($2 == "" || $2 == " " || $2 == "\t") {print $0}' $file

, и в результате получается следующее:

user1::53556:100::/home/user1:/bin/bash
user2: :53557:100::/home/user2:/bin/bash
user3:  :53558:100::/home/user3:/bin/bash

Как можно сказать, чтобы awk заменитьэто 2-е поле (пустое или с пробелом или табуляцией) с другим символом?(например х)

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019
$ awk 'BEGIN{FS=OFS=":"} (NF>1) && ($2~/^[[:space:]]*$/){$2="x"} 1' file
user1:x:53556:100::/home/user1:/bin/bash
user2:x:53557:100::/home/user2:/bin/bash
user3:x:53558:100::/home/user3:/bin/bash

Чтобы изменить исходный файл с помощью GNU awk:

awk -i inplace 'BEGIN{FS=OFS=":"} (NF>1) && ($2~/^[[:space:]]*$/){$2="x"} 1' file

или с любым awk:

awk 'BEGIN{FS=OFS=":"} (NF>1) && ($2~/^[[:space:]]*$/){$2="x"} 1' file > tmp && mv tmp file

Тест для NF>1 гарантирует, что мы работаем только на линияхв котором уже есть как минимум 2 поля, и поэтому мы не создаем строку, например :x, в выходных данных, когда во входном файле есть пустая строка.Остальное, надеюсь, очевидно.

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

Не могли бы вы попробовать следующее.

awk 'BEGIN{FS=OFS=":"} {$2=$2=="" || $2~/^[[:space:]]+$/?"X":$2} 1' Input_file

Объяснение: Добавление пояснения к вышеуказанному коду.

awk '                                          ##Starting awk program here.
BEGIN{                                         ##Starting BEGIN section here which will be executed before Input_file is being read.
  FS=OFS=":"                                   ##Setting FS and OFS as colon here for all lines of Input_file.
}                                              ##Closing BEGIN section block here.
{
  $2=$2=="" || $2~/^[[:space:]]+$/?"X":$2      ##Checking condition if $2(2nd field) of current line is either NULL or having complete space in it then put its vaklue as X or keep $2 value as same as it is.
}
1                                              ##mentioning 1 will print edited/non-edited current line.
' Input_file                                   ##Mentioning Input_file name here.


РЕДАКТИРОВАТЬ: В соответствии с OP, OP не нужно касаться последней строки Input_file, поэтому добавив следующее решение сейчас.

tac Input_file | awk 'BEGIN{FS=OFS=":"} FNR==1{print;next} {$2=$2=="" || $2~/^[[:space:]]+$/?"X":$2} 1' | tac


РЕДАКТИРОВАТЬ 2: Если вы хотите сделать это просто kin single awk, попробуйте следующее.

awk '
BEGIN{
  FS=OFS=":"
}
prev{
  num=split(prev,array,":")
  array[2]=array[2]=="" || array[2]~/^[[:space:]]+$/?"X":array[2]
  for(i=1;i<=num;i++){
    val=(val?val OFS array[i]:array[i])
  }
  print val
  val=""
}
{
  prev=$0
}
END{
  if(prev){
    print prev
  }
}'  Input_file

Если вы хотите изменить сам Input_file, добавьте> temp_file && mv temp_file Input_file в коде выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...