gpt4 book ai didi

awk 在特定字段中搜索模式并替换其内容

转载 作者:行者123 更新时间:2023-12-02 04:25:31 25 4
gpt4 key购买 nike

我需要找到空的密码字段,带空格或制表符,并将其替换为 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 用另一个字符替换这个第二个字段(空的或空格或制表符)? (例如 x)

最佳答案

能否请您尝试以下。

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


EDIT2:如果您想在单个 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

关于awk 在特定字段中搜索模式并替换其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54902691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com