0

我必须在我的nrpe.cfg文件中附加这一行,在 200 多台服务器中:

command[check_utc]=/company/nrpe/libexec/check_utc.sh

但是对于某些问题,有些机器不止一次有这条线。所以现在我想检查是否有不止一次并将其删除,只留下指定命令的一行。我需要在shell脚本中执行此操作。

4

2 回答 2

1

方法一:消除所有重复行

    cat filename | sort | uniq > outfile
    mv outfile filename

这些|字符将左侧命令的输出作为输入提供给右侧的命令。

cat命令将文件内容读取到标准输出(屏幕或其他文件)

sort命令按字母顺序对输出进行排序,这是在使用uniq...

uniq命令消除相邻的重复值

> outfile最后一步的输出写入名为“outfile”的文件

mv命令将原始文件替换为新的数据文件 outfile

此方法将具有破坏性,因为它将删除任何类型的所有重复行,而不仅仅是您要删除的行。

方法2:删除特定行的所有实例,然后重新添加一次

    cat filename | sed 's/command\[check_utc\]\=\/company\/nrpe\/libexec\/check_utc.sh//' > outfile
    mv outfile filename

sed命令允许对特定字符串模式执行字符串替换。此类命令的格式是sed 's/find/replace/'在每一行中查找“find”的第一个实例并将其替换为“replace”。为了使它适用于每一行的每个实例,你在末尾添加“g”,即sed 's/find/replace/g'

这些\字符会导致sed按字面意思解释字符串中的特殊字符,否则这些字符会被误读为特殊指令。

上面的命令将完全删除该特定字符串的所有实例(将其替换为空),然后您需要编辑代码并将其重新添加一次

方法3:删除所有实例,然后自动重新添加到文件末尾

    cat filename | sed 's/command\[check_utc\]\=\/company\/nrpe\/libexec\/check_utc.sh//' > outfile
    mv outfile filename
    echo "command[check_utc]=/company/nrpe/libexec/check_utc.sh" >> filename

这与上面的代码相同,但在删除字符串的所有实例后,您echo可以打印该行>>并将文本附加到文件名内容的末尾

于 2013-04-17T17:34:06.523 回答
0

如果线条不相邻,并且您不介意对它们进行排序,这将起作用。

$ cat foo.txt
wings of fire
this is a test
food that are killing you
this is a test

结果

$ sort -u foo.txt
food that are killing you
this is a test
wings of fire
于 2013-04-17T16:57:26.523 回答