Linux服务器运维之批量替换内容
涉及指令
本操作主要涉及的指令有find
,sed
1. find
指令
命令格式:
find pathname -options [-print -exec -ok ...]
命令功能:
用于在文件树种查找文件,并作出相应的处理
命令参数:
pathname
: find
命令所查找的目录路径。例如用.来表示当前目录,用/
来表示系统根目录。
-print
: find
命令将匹配的文件输出到标准输出。
-exec
: find
命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为`command’ { } \;,注意{ }和\;之间的空格。
-ok
: 和-exec
的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
命令选项:
-name
按照文件名查找文件。-perm
按照文件权限来查找文件。find . -perm 755 –print
在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件
-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth
选项,那么-prune
将被find
命令忽略。find /apps -path "/apps/bin" -prune -o –print
在/apps目录下查找文件,但不希望在/apps/bin目录下查找find /usr/sam -path "/usr/sam/dir1" -prune -o –print
在/usr/sam目录下查找不在dir1子目录之内的所有文件-user
按照文件属主来查找文件。find ~ -user sam –print
在$HOME目录中查找文件属主为sam的文件-group
按照文件所属的组来查找文件。find /apps -group gem –print
在/apps目录下查找属于gem用户组的文件-mtime -n +n
按照文件的更改时间来查找文件,- n
表示文件更改时间距现在n天以内,+ n
表示文件更改时间距现在n天以前。find
命令还有-atime
和-ctime
选项,但它们都和-m time选项。find / -mtime -5 –print
在系统根目录下查找更改时间在5日以内的文件find /var/adm -mtime +3 –print
在/var/adm目录下查找更改时间在3日以前的文件-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups
中不存在。find / –nogroup -print
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd
中不存在。find /home -nouser –print
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件。-type
查找某一类型的文件,诸如:
b
– 块设备文件。
d
– 目录。
c
– 字符设备文件。
p
– 管道文件。
l
– 符号链接文件。
f
– 普通文件。-size n
:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。-depth
:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。-fstype
:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。-mount
:在查找文件时不跨越文件系统mount点。-follow
:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。-cpio
:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
另外,下面三个的区别:
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n24小时访问的文件
-cmin n
查找系统中最后N分钟被改变文件状态的文件
-ctime n
查找系统中最后n24小时被改变文件状态的文件
-mmin n
查找系统中最后N分钟被改变文件数据的文件
-mtime n
查找系统中最后n*24小时被改变文件数据的文件
2. sed
指令
sed
是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本
选项与参数:
-n
:使用安静(silent)模式。在一般 sed
的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n
参数后,则只有经过sed
特殊处理的那一行(或者动作)才会被列出来。
-e
:直接在命令列模式上进行 sed
的动作编辑;
-f
:直接将 sed
的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed
动作;
-r
:sed
的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i
:直接修改读取的文件内容,而不是输出到终端。
动作说明: [n1[,n2]]function
n1, n2
:不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function
:
a
:新增, a
的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c
:取代, c
的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d
:删除,因为是删除啊,所以 d
后面通常不接任何咚咚;
i
:插入, i
的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p
:列印,亦即将某个选择的数据印出。通常 p
会与参数 sed -n
一起运行~
s
:取代,可以直接进行取代的工作哩!通常这个 s
的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
3. 批量替换
以最近的例子,需求:
将此代码粘贴到页面的 <head> 部分中,并使其尽可能靠近顶部位置:
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5N73GZ');</script>
<!-- End Google Tag Manager -->
逻辑转换为:
在</head>
标签之前,插入上述代码即可!
将上述内容复制到文本编辑器中,批量替换\r\n
(换行符)为\n
,由于存在/
和!
,则需要对其转义为\/
和\!
,,然后如下:
<\!-- Google Tag Manager -->\n<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l\!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n'https:\/\/www.googletagmanager.com\/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','GTM-5N73GZ');<\/script>\n<\!-- End Google Tag Manager -->\n<\/head>
替换指令:
find . -type f -name "*.文件后缀" -exec sed -i "s/目标字符串/最终替换字符串/g" {} +
其中文件后缀为html,目标字符串转义后的</head>
。
完整指令如下:
find . -type f -name "*.html" -exec sed -i "s/<\/head>/<\!-- Google Tag Manager -->\n<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l\!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n'https:\/\/www.googletagmanager.com\/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','GTM-5N73GZ');<\/script>\n<\!-- End Google Tag Manager -->\n<\/head>/g" {} +
Linux下,利用cd
指令进入要处理的目录,执行上面的完整指令既可实现所有html批量替换。
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=82
好
好