写⼊⽂件,追加内容,修改内容;shell,sed
salt '*' cmd.run 'sed -i 's/SELINUX\=enforcing/SELINUX\=disabled/g' /etc/sysconfig/selinux'
....
#! /bin/bash
echo "测试写⽂件"
cat>test1<<EOF
这是⼀个由shell创建的⽂件
this is a file created by shell.
we want to make a good world.
EOF
其中,<<EOF 表⽰当遇到EOF时结束输⼊。
cat>test1<<EOF 这间没有空格
在編寫Shell Script時,如果你有echo到某個檔案的需求,你希望寫⼊檔案時是以附加(append)的⽅式進⾏,⽽不是整個覆蓋的話,你可以使⽤【>>】來取代【>】:
echo "aaa" >> /home/
echo "bbb" >> /home/
如此⼀來,中的內容就會是:
aaa
bbb
====================================================
ctags:  linux perl shell perl  vi grep awk xargs  批量替换
⽅法1:
这两天在构建⼀个应⽤的使⽤⽤到了maven,由于project很⼤,⾜⾜有700多个 l⽂件,更郁闷的是在很多l⽂件⾥都单独指定了资源库的url,我需要把这些资源库的url统⼀指定到nexus本地中央库.
⼿⼯⼀个个改⽂件配置有点不太实际,所以google了⼀下,到批量替换⽂件内容的好⽅法,命令结构如下:
find -name '要查的⽂件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下⾯这个例⼦就是将当前⽬录及所有⼦⽬录下的所有l⽂件中的”/maven2“ 替换为
”localhost:8081/nexus/content/groups/public“.
find -name 'l' | xargs perl -pi -e 's|/maven2|localhost:8081/nexus/content /groups/public|g'这⾥⽤到了Perl语⾔,
perl -pi -e 在Perl 命令中加上-e 选项,后跟⼀⾏代码,那它就会像运⾏⼀个普通的Perl 脚本那样运⾏该代码.
从命令⾏中使⽤Perl 能够帮助实现⼀些强⼤的、实时的转换。认真研究正则表达式,并正确地使⽤,将会为您省去⼤量的⼿⼯编辑⼯作。
find -name 'l' | xargs perl -pi -e 's|/maven2|localhost:8081/nexus/content/groups/public|g'
⽅法2:
Linux下批量替换多个⽂件中的字符串的简单⽅法。⽤sed命令可以批量替换多个⽂件中的字符串。
⽤sed命令可以批量替换多个⽂件中的字符串。
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在⽬录`
例如:我要把mahuinan替换为huinanma,执⾏命令:
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
这是⽬前linux最简单的批量替换字符串命令了!
具体格式如下:
sed -i "s/oldString/newString/g"  `grep oldString -rl /path`
实例代码:sed -i "s/⼤⼩多少/⽇⽉⽔⽕/g" `grep ⼤⼩多少 -rl /usr/aa`
sed -i "s/⼤⼩多少/⽇⽉⽔⽕/g" `grep ⼤⼩多少 -rl ./`
⽅法3:
==================
简介
存储输出。Sed主要⽤来⾃动编辑⼀个或多个⽂件;简化对⽂件的反复操作;编写转换程序等。
sed使⽤参数
[root@www ~]# sed [-nefr] [动作]
选项与参数:
-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 就是啦!
以⾏为单位的新增/删除
将 /etc/passwd 的内容列出并且列印⾏号,同时,请将第 2~5 ⾏删除!
[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后⾯省略).....
sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 ⾏给他删除了,所以显⽰的数据就没有 2-5 ⾏罗~另外,注意⼀下,原本应该是要下达 sed -e 才对,没有 -e 也⾏啦!同时也要注意的是, sed 后⾯接的动作,请务必以 '' 两个单引号括住喔!
只要删除第 2 ⾏
nl /etc/passwd | sed '2d'
要删除第 3 到最后⼀⾏
nl /etc/passwd | sed '3,$d'
在第⼆⾏后(亦即是加在第三⾏)加上『drink tea?』字样!
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后⾯省略).....
那如果是要在第⼆⾏前
nl /etc/passwd | sed '2i drink tea'
如果是要增加两⾏以上,在第⼆⾏后⾯加⼊两⾏字,例如『Drink tea or .....』与『drink beer?』
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后⾯省略).....
每⼀⾏之间都必须要以反斜杠『 \ 』来进⾏新⾏的添加喔!所以,上⾯的例⼦中,我们可以发现在第⼀⾏的最后⾯就有 \ 存在。
以⾏为单位的替换与显⽰
将第2-5⾏的内容取代成为『No 2-5 number』呢?
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(后⾯省略).....
透过这个⽅法我们就能够将数据整⾏取代了!
仅列出 /etc/passwd ⽂件内的第 5-7 ⾏
[root@www ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
可以透过这个 sed 的以⾏为单位的显⽰功能,就能够将某⼀个⽂件内的某些⾏号选择出来显⽰。
数据的搜寻并显⽰
搜索 /etc/passwd有root关键字的⾏
nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync
....下⾯忽略
如果root到,除了输出所有⾏,还会输出匹配⾏。
使⽤-n的时候将只打印包含模板的⾏。
nl /etc/passwd | sed -n '/root/p'
1  root:x:0:0:root:/root:/bin/bash
数据的搜寻并删除
删除/etc/passwd所有包含root的⾏,其他⾏输出
nl /etc/passwd | sed  '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
....下⾯忽略
#第⼀⾏的匹配root已经删除了
数据的搜寻并执⾏命令
到匹配模式eastern的⾏后,
搜索/etc/passwd,到root对应的⾏,执⾏后⾯花括号中的⼀组命令,每个命令之间⽤分号分隔,这⾥把bash替换为blueshell,再输出这⾏: nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
1  root:x:0:0:root:/root:/bin/blueshell
如果只替换/etc/passwd的第⼀个bash关键字为blueshell,就退出
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'
1  root:x:0:0:root:/root:/bin/blueshell
数据的搜寻并替换
除了整⾏的处理模式之外, sed 还可以⽤⾏为单位进⾏部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:
sed 's/要被取代的字串/新的字串/g'
先观察原始信息,利⽤ /sbin/ifconfig 查询 IP
[root@www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....
本机的ip是192.168.1.100。
将 IP 前⾯的部分予以删除
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
将 IP 后⾯的部分予以删除
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100
多点编辑
⼀条sed命令,删除/etc/passwd第三⾏到末尾的数据,并把bash替换为blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
-e表⽰多点编辑,第⼀个编辑命令删除/etc/passwd第三⾏到末尾的数据,第⼆条命令搜索bash替换为blueshell。
直接修改⽂件内容(危险动作)
sed 可以直接修改⽂件的内容,不必使⽤管道命令或数据流重导向!不过,由於这个动作会直接修改到原始的⽂件,所以请你千万不要随便拿系统配置来测试!我们还是使⽤下载的 ⽂件来测试看看吧!
利⽤ sed 将 内每⼀⾏结尾若为 . 则换成 !
[root@www ~]# sed -i 's/\.$/\!/g'
利⽤ sed 直接在 最后⼀⾏加⼊『# This is a test』
正则匹配到第一个关键字就停止[root@www ~]# sed -i '$a # This is a test'
由於 $ 代表的是最后⼀⾏,⽽ a 的动作是新增,因此该⽂件最后新增『# This is a test』!
sed 的『 -i 』选项可以直接修改⽂件内容,这功能⾮常有帮助!举例来说,如果你有⼀个 100 万⾏的⽂件,你要在第 100 ⾏加某些⽂字,此时使⽤ vim 可能会疯掉!因为⽂件太⼤了!那怎办?就利⽤ sed 啊!透过 sed 直接修改/取代的功能,你甚⾄不需要使⽤ vim 去修订!
==================
4.1 sed命令基本⽤法
sed是⼀个⾮交互式⽂本编辑器,它可以对⽂本⽂件和标准输⼊进⾏编辑,标准输⼊可以是来⾃键盘输⼊、⽂件重定向、字符串、变量、来⾃管道的⽂本
sed从⽂本的⼀个⽂本⾏或标准输⼊中读取数据,将其复制到缓存区,然后读取命令⾏或脚本的第⼀个命令,对此命令要
求的⾏号进⾏编辑,重复此过程,直到命令⾏或脚本中所有命令都执⾏完了。sed可以⼀次性处理所有的编辑命令,⾮常⾼效
sed适⽤于下⾯三种场合:
* 编辑相对于交互式⽂本编辑器⽽⾔太⼤的场合
* 编辑命令太复杂,在交互式⽂本编辑器中难以输⼊的情况
* 对⽂件扫描⼀遍,但是需要执⾏多个编辑函数的情况
sed只是对缓存区中原始⽂件的副本进⾏编辑,并不编辑原始⽂件。因此,如果需要保存更改内容,需要将输出重定向到另⼀个⽂件,可以使⽤下⾯的命令:
sed 'sed命令' input_file > result_file
或者还有另⼀种⽅法就是 -w 选项,这个后⾯讲到
有三种⽅式调⽤sed:
①直接在shell命令⾏上调⽤
# sed [选项] 'sed命令' 输⼊⽂件
②将sed命令插⼊脚本⽂件后,通过sed命令调⽤脚本:
# sed [选项] -f sed脚本⽂件名输⼊⽂件
③将sed命令写⼊脚本⽂件后,将其+x变成可执⾏
./sed脚本⽂件输⼊⽂件
第三种⽅式需要在⽂件头部加上 #!/bin/sed
sed命令的常⽤选项:
-n    不打印所有⾏到标准输出
-e    表⽰将下⼀个字符串解析为sed编辑命令,如果只传递⼀个编辑命令,-e可以省略
-f    表⽰正在调⽤sed脚本⽂件
sed命令通常由定位⽂本⾏和sed编辑命令两部分组成,sed编辑命令对定位到的⾏进⾏各种编辑处理
sed提供两种⽅式定位⽂本⾏:
* 使⽤⾏号,指定⼀⾏或者⾏号范围
* 使⽤正则表达式
sed命令定位⽂本⾏的⽅法:
选项意义
x x为指定⾏号
x,y指定从x到y的⾏号范围
/pattern/查询包含模式的⾏
/pattern/pattern/查询包含两个模式的⾏
/pattern/,x从与pattern的匹配⾏到x号⾏之间的⾏
x,/pattern/从x号⾏到与pattern的匹配⾏之间的⾏
x,y!查询不包含x和y⾏号的⾏
===================================分割线=======================
sed编辑命令表

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。