【问题标题】:How find duplicated[s] line[s] and remove it? [duplicate]如何找到重复的 [s] 行 [s] 并将其删除? [复制]
【发布时间】:2026-02-19 09:55:02
【问题描述】:

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

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

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

【问题讨论】:

  • 他们不是史蒂文的邻居。

标签: bash shell nagios nrpe


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

【讨论】:

  • 这个文件是一个配置文件,顾名思义,nrpe.cfg,所以这就是为什么行不相邻,我应该保持文件原样,所以任何行都会被修改,只是删除重复的行。并将其附加在末尾。谢谢你的回答!
  • 仅供参考。我不小心在 echo 命令中包含了 \,这些是由 echo 逐字打印的,应该被排除在外。您可能需要仔细检查您的 cfg 文件以确保它们未包含在文本中。我已经相应地更改了代码。
【解决方案2】:

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

$ 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

【讨论】: