概述
在 Linux 系统中有时候我们需要替换某个很长的字符串或者修改某个配置参数,有些文件又隐藏目录比较深,有些场景也需要在一个目录下批量去修改文件,那应该怎么高效,快速的去完成修改呢?下面记录一下本人实施过程中的一些方法,做个备忘手稿分享以备随时查看。
系统平台
CentOS Linux 7
第一种场景
同一个目录下,如何快速批量修改替换字符窜。
先查看文件内容,找到需要替换的字符串,比如 admin.conf 文件内容如下。
需要替换服务器 IP 192.168.59.138
再查看其他的文件内容,找到需要替换的字符串,比如 kubelet.conf 文件内容如下。
也同样是需要替换服务器 IP 192.168.59.138,查看其他几个 *.conf 文件,也都同样是需要替换服务器 IP 192.168.59.138 字符串,应该怎么快速,高效的修改呢?
使用 vim **** 一个文件一个文件的修改?同一个目录下如有 1~2 个文件,那使用 vim 修改一下,到还是可以的。
那如果同一个目录下,有十几个或几十个文件,那还用 vim 修改,是不是就要疯了呢?如果老板在身后看着,那年底KPI末尾淘汰,是不是就该轮到你了呢?
这时候就可以使用下面的方法进行批量修改替换,速度效率也就高了很多。
# ls -lh
total 32K
-rwxr-xr-x 1 scm scm 5.6K Jun 16 20:30 admin.conf
-rwxr-xr-x 1 scm scm 5.6K Jun 16 20:30 controller-manager.conf
-rwxr-xr-x 1 scm scm 2.0K Jun 16 20:30 kubelet.conf
drwxr-xr-x 2 scm scm 113 Jun 16 20:30 manifests
drwxr-xr-x 3 scm scm 4.0K Jun 16 20:30 pki
-rwxr-xr-x 1 scm scm 5.5K Jun 16 20:30 scheduler.conf
#
# find . -name '*.conf' | xargs sed -i 's/59.138/59.149/g'
# cat admin.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EWXhNREE0TXpNek1Wb1hEVE16TURZd056QTRNek16TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTkcrClJHZ2lGR0FsdmF3UmtYT3V6V0NYU0QvVE00ZkNHRXhZWnYwYk1TMGtENGVicjBaWTV3Umk5eVp6a0Zxb3FSaUIKcmVKbzRjMkFHZk1zTzZqOGxuelllNkcrUitDeS93RTN6a3o1NXJBK2JkUTJUYzhlYzExR1dSY0hYYkdEaDQ5eApGWGRBR3hBTjlHMnprNDJ4dURmMzlXMlNzeFU5NVpuWXFmRk5tL0tOZzF1RlpabWJOZThFdm1lbkppYXpDVFB0ClhZMnpSM1lZMTZya0tIWHE2MmFUazNuMFNEbENlbWNPK2dQZUt0UGVVZ0cybWJ1a05VS0tKdkNXclgweVRiSC8KQjU5bkxEY3diNFRrcnZEUlp5TTl5VVdoZmtlTTY5TFNCOThUM09IbHM2MlNOMEVoQXRFeUViaCs0ZGxWU2JTbwpXNDFGR1lXemZTNzhFWTc5T1RrQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZFcjlRUVVYcGI2c0ttS3J5cG53ZTgzMUlYTzZNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRHR2ZFFpTjZsMXNOLzlSNzlvTgpTTnFrMVpEN3RhY2dwMTN3L1FJZ3J4a3U1UHU4bk5wQVJlRklGbSt3VGlhN1AxaWxDbmFMNytjd1pjSzJaaWxTCmlERTYrWTYxS0c1RFQ0Rml4UDVCajBGeVBJbVhRelFMdnNuMGNwRUtPWGN6b3ZrVGdtdlkxeXRuSmpUQ0IwM28KdS91bjFMaHRxZnEzdkNlUUUxMDRidHBaenQxbE9yZWNoemcwc2pNK1hPNGhBQWJGRjNRSnJjWUU0dC9SaXlaaQp5R29HZzJSMSs0T0NHS1NocWEyS2t1MFd3dFQ2L1NSRElUVjgwbUVYTVM0VVFJMW1Xb2xXaGR0Y1lkcnhEY28rCmNONUlXNmQwSm13OHlEbFhTVXEzN1h6TmtrNEVraHJ1SkJETzlMTCt3bElRdi9haWVSRVNvVzQzWUo1NTczUXAKNis4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://192.168.59.149:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
再查看其他的文件,看看是不是都批量修改替换了。
# cat controller-manager.conf
# cat kubelet.conf
可以看到,在相同目录下,就执行了上面的一条 # find . -name '*.conf' | xargs sed -i 's/59.138/59.149/g' 指令,就可以快速,高效的修改替换相同目录下所有文件里包含的字符串了,不用在打开文件,一个文件一个文件去修改了,这是不是就提高了工作效能呢?
第二种场景
一个文件里有多处相同的字符串需要修改,那需要怎么操作呢?
此时可以使用另外一条指令,不用打开文件即可替换修改字符串,而且可以批量替换修改相同目录下的多个文件内容,而且还可以将旧文件用指定的扩展名来进行备份。
查看一下批量备份的文件,跟修改后的文件比较。
# diff etcd.yaml etcd.yaml.bak
可以看到文件里多处需要替换修改的字符串,也都批量进行了替换修改,而且都把之前的文件做了批量备份,以防修改有问题,好查看好回滚文件。
第三种场景
那就是用 sed 命令,sed 命令表示 Stream Editor(流编辑器),用来在 Linux 上执行基本的文本操作。它可以执行各种功能,如搜索、查找、修改、插入或删除文件,也可以执行复杂的正则表达式匹配。
# sed -i 's/59.149/99.109/' etcd.yaml
可以看到上面执行的 sed 指令也替换了需要修改的字符串,使用格式: sed -i ‘s/查找字段/替换字段/g’ ***文件名
也可以使用下面的方式,在相同目录下,替换修改所有相同的文件。
# sed -i 's/59.149/99.109/' *.yaml
# sed -i 's/59.149/99.109/g' *.yaml
上面3种方式,就是本人经常使用到的指令,还有很多指令参数,在配合正则表达式组合起来使用,那功能会更加强大,同学们有时间可以深入学习研究,今天就分享到这,希望对各位有所帮助。