在Bash中找到文件中的一行并在该行末尾添加内容

4

如何识别以特定模式开头的行并在行末添加内容?

如果应该添加的模式尚未附加:

假设我想通过开始处的模式(可能是IP地址)或上面的注释来查找主机文件中的特定行。

例如:

#This is your hosts file

127.0.0.1 localhost linux 

#This is added automatically 

192.168.1.2 domain1. com 

#this is added automatically to 

192.168.1.2 sub.domain1.com www.domain1.com

我怎样告诉bash当你找到我告诉你的IP地址时,进入行末并添加一些内容?
或者另一种情况:
当bash找到注释#This is added automatically时,
向下移动2行后再到行末添加一些内容。
您看,我是初学者,不知道在这里使用什么以及如何使用。这是否可以通过sed完成?还是可以用grep完成?我必须学习AWK来处理这些东西吗?
3个回答

9
这将在以模式“127.0.0.1”结尾的行末添加一些文本。
grep -F "127.0.0.1" file | sed -ie 's/$/& ADDing SOME MORE TEXT AT THE END/g'

以下是使用sed向以127.0.0.1开头的行添加内容的方法:

sed -ie 's/^127.0.0.1.*$/& ADDing MORE TEXT TO THE END/g' file

为了达到相同的效果,你也可以使用 awk
awk '/^127.0.0.1/{print $0,"ADD MORE TEXT"}' file > newfile && mv newfile file
  • 编辑

如果您想通过变量调用IP地址,则语法可能会有些不同:

var="127.0.0.1"
grep -F "$var" file | sed -ie 's/$/& ADD MORE TEXT/g'
sed -ie "s/^$var.*$/& ADD MORE TEXT/g" file
awk '/^'$var'/{print $0,"ADD MORE TEXT"}' file > newfile && mv newfile file

1
这是一个很好的例子。它展示了使用grep、sed和awk三种不同的方式。同时,您尽可能地通用化。谢谢。 - Josh
我看到你已经避开了$符号。这是否意味着你的示例只适用于文本而不适用于变量? - Josh
这个程序几乎可以满足需求,但如果我想强制sed每次运行脚本时将ADDD MOR TEXT字符串写入以var开头的行中,该怎么办? - Josh
@user121261,你的表现非常不一致!当前的写法会在每次运行时在行末添加“ADD MORE TEXT”。你需要使用-i选项交互式地修改文件。请参考我的编辑。 - iamauser
第一个命令在使用sed 4.2.2时会出现“sed: no input files”错误。 - ssgao

3
给定以下内容:
文本文件:
[root@yourserver ~]# cat text.log 
#This is your hosts file

127.0.0.1 localhost linux 
[root@yourserver ~]# 

bash脚本:

[root@yourserver ~]# cat so.sh 
#!/bin/bash

_IP_TO_FIND="$1"

# sysadmin 101 - the sed command below will backup the file just in case you need to revert

_BEST_PATH_LINE_NUMBER=$(grep -n "${_IP_TO_FIND}" text.log | head -1 | cut -d: -f1)
_LINE_TO_EDIT=$(($_BEST_PATH_LINE_NUMBER+2))
_TOTAL_LINES=$( wc -l text.log)
if [[ $_LINE_TO_EDIT -gte $_TOTAL_LINES ]]; then
   # if the line we want to add this to is greater than the size of the file, append it
  sed -i .bak "a\${_LINE_TO_EDIT}i#This is added automatically\n\n192.168.1.2 domain1. com" text.log
else
  # else insert it directly 
  sed -i .bak "${_LINE_TO_EDIT}i\#This is added automatically\n\n192.168.1.2 domain1. com" text.log
fi

使用方法:

bash ./so.sh 127.0.0.1

只需输入您想查找的IP地址,此脚本将在第一次出现时进行匹配。

希望这可以帮到您!


谢谢您提供这个很好的例子。这非常符合我的实际情况。我只是选择了这个例子,因为我没有其他想法。我会仔细研究并在学习过程中尝试理解您的做法。 - Josh
我没有问题解释所有的东西,现在会添加一些注释来展示我为什么/如何做这些事情!@user121261 - Malcolm Jones
哎呀,刚看到有人已经回答了,很高兴你找到了解决方案! - Malcolm Jones

1
这个内联的sed应该可以工作:

sed -i.bak 's/^192\.168\.1\.2.*$/& ADDED/' hosts 
  1. 这个sed命令用于查找以192.168.1.2开头的行。
  2. 如果找到,则在这些行的末尾添加ADDED

如何进行反向操作? - CMCDragonkai
@CMCDragonkai:请明确您从这个命令中想要的内容。 - anubhava
1
那个程序有很多漏洞。我在这里修复了它们:https://github.com/Polycademy/add-etc-hosts 但请确保备份您的 /etc/hosts 文件。 - CMCDragonkai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接