我有大约 14,800 个文件分散在名为/actlogs/
和 的子文件夹中。这些文件的第一行包含一个链接,例如:
http://server.com/file.pdf
我需要将字符串“server.com”替换为“server.com”的实际IP地址
有什么办法可以在 /actlogs/ 和子文件夹中找到 *.log 并为每个文件替换其 IP 的主机吗?
我正在使用 Ubuntu Server 18.04。
答案1
这听起来像是一份工作sed
:
sed 's/server\.com/192.168.0.1/' *.log
sed
是一个逐行处理输入的流编辑器。这里我们使用的是s
替代命令s/regex/replacement/flags
。一旦您确定这就是您想要的,您就可以添加标志i
,使更改“就位”。将*
在 shell 中进行 glob 并将所有以 sed 结尾的文件.log
作为输入传递给 sed。
sed 's/server\.com/192.168.0.1/' *.log
请注意,这将仅替换每行中第一次出现的模式。如果您想替换所有出现的情况,无论它们出现在哪里,您可以使用全局标志:
sed 's/server\.com/192.168.0.1/g' *.log
对于需要搜索的目录层次结构,您可以使用find
然后sed
在结果上执行:
find /home/www/ -type f -name '*.log' -exec \
sed 's/server\.com/192.168.0.1/g' {} +
答案2
这应该可以完成工作:
find . -type f -name "*.log" -exec sed 's/server\.com/192.168.0.1/g' {} +
答案3
补充 @user1774469 正确答案,以允许使用 bash 替换日志下所有子文件夹中的文件中的字符串*.log
,可以通过以下方式实现
1)激活globstar
shell选项:
shopt -s globstar
2)发出@user1774469正确的命令并进行以下修改
sed 's/server\.com/192.168.0.1/' /actlogs/**/*.log
然后它将匹配目录.log
下任何位置的扩展名的所有文件/actlogs/
。