gpt4 book ai didi

linux - 如何使用 awk 从文件中删除一行并按某个字符串过滤

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:04 25 4
gpt4 key购买 nike

我有一个由空格分隔的文件。我需要编写一个接收主机名参数的 awk 命令如果文件中已经定义了主机名,则它应该替换主机名。它必须是完全匹配而不是部分匹配 - 如果文件包含此主机名:localhost搜索“ho”将失败,它将被添加到文件末尾。

另一个选项是删除:awk 再次接收主机名参数,如果存在,它应该从文件中删除它。

这是我到目前为止所拥有的:(需要一些增强)

if [ "$DELETE_FLAG" == "" ]; then
# In this case the entry should be added or updated
# if clause deals with updating an existing entry
# END clause deals with adding a new entry
awk -F"[ ]" "BEGIN { found = 0;} \
{ \
if ($2 == $HOST_NAME) { \
print \"$IP_ADDRESS $HOST_NAME\"; \
found = 1; \
} else { \
print \$0; \
} \
} \
END { \
if (found == 0) { \
print \"$IP_ADDRESS $HOST_NAME\";
} \
} " \
/etc/hosts > /etc/temp_hosts

else
# Delete an existing entry
awk -F'[ ]' '{if($2 != $HOST_NAME) { print $0} }' /etc/hosts > /etc/temp_hosts
fi

谢谢

最佳答案

您不必将 FS 设置为空格,因为默认情况下 FS 已经是空格。而且您不必使用 \。使用 -v 选项将 shell 变量传递给 awk。并且不需要在每个语句末尾使用分号

if [ "$DELETE_FLAG" == "" ]; then
# In this case the entry should be added or updated
# if clause deals with updating an existing entry
# END clause deals with adding a new entry
awk -v hostname="$HOST_NAME" -v ip="$IP_ADDRESS" 'BEGIN { found = 0}
{
if ($2 == hostname) {
print ip" "hostname
found = 1
} else {
print $0
}
}
END {
if (found == 0) {
print ip" "hostname
}
}' /etc/hosts > /etc/temp_hosts

else
# Delete an existing entry
awk -v hostname="$HOST_NAME" '$2!=hostname' /etc/hosts > /etc/temp_hosts
fi

关于linux - 如何使用 awk 从文件中删除一行并按某个字符串过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662769/

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