如何找到重复的[s]行[s]并将其删除?

时间:2013-04-17 16:47:48

标签: bash shell nagios nrpe

我必须在我的nrpe.cfg文件中追加200多台服务器:

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

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

2 个答案:

答案 0 :(得分:1)

方法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打印该行并使用>>将文本附加到文件名内容的末尾

答案 1 :(得分: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