我必须在我的nrpe.cfg
文件中追加200多台服务器:
command[check_utc]=/company/nrpe/libexec/check_utc.sh
但是对于某些问题,一些机器不止一次这一行。所以现在我想检查是否有多次并删除它,只留下一行指定的命令。
我需要在shell
脚本中执行此操作。
答案 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