我必须在我的nrpe.cfg
文件中附加这一行,在 200 多台服务器中:
command[check_utc]=/company/nrpe/libexec/check_utc.sh
但是对于某些问题,有些机器不止一次有这条线。所以现在我想检查是否有不止一次并将其删除,只留下指定命令的一行。我需要在shell
脚本中执行此操作。
方法一:消除所有重复行
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
可以打印该行>>
并将文本附加到文件名内容的末尾
如果线条不相邻,并且您不介意对它们进行排序,这将起作用。
$ 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