如何在bash中的文件中的特定行的末尾附加一个字符串

时间:2014-03-03 22:36:50

标签: bash sed awk

我想在我的hosts文件的某一行的末尾添加一个别名。例如

我有

192.168.1.1    www.address1.com
192.168.1.2    www.address2.com
192.168.1.3    www.address3.com

我希望它看起来像

192.168.1.1    www.address1.com
192.168.1.2    www.address2.com myalias
192.168.1.3    www.address3.com

我想找到包含19.2.68.1.2的行,并在其末尾添加myalias。该行不一定是文件中的第二行,就像我在这里看到的那样。它可能在任何地方。

4 个答案:

答案 0 :(得分:37)

使用sed和描述的模式:

sed '/192.168.1.2/s/$/ myalias/' file

使用sed和特定的行号:

sed '2s/$/ myalias/' file

答案 1 :(得分:1)

awk解决方案也是可能的:

awk '{if (/^192\.168\.1\.2 /) {$0=$0 " myalias"}; print}' hosts

上面逐一从hosts文件中读取行。如果该行在开头有我们的IP地址,则myalias将附加到该行。然后该行打印到stdout

注意两件事。 if条件下的IP地址后面有一个空格。否则,正则表达式可以匹配192.168.1.20等。此外,IP地址中的句点将使用反斜杠进行转义。否则,他们可以匹配任何角色。

解决方案的一个简单形式是:

awk '/^192\.168\.1\.2 /{$0=$0 " myalias"}1' hosts

答案 2 :(得分:0)

以下是使用awk

的另一种方法
awk '/search pattern/{print $0 " myalias"; next}1'  file

答案 3 :(得分:0)

我会选择awk,因为你可以使用字符串而不必使用正则表达式,其中需要转义点,并且需要使用锚点和/或单词边界。您还可以确保字符串与第1列中的值匹配。

awk '$1==s{$0=$0 OFS alias}1' s=192.168.1.2 alias=myalias file

此外,当它是更大脚本的一部分时,能够使用变量字符串是很好的。使用sed,您需要shell变量并引用技巧..