sedツール(スクリプトアーティファクトの編集!)

sedツール(スクリプトアーティファクトの編集!)


sedエディター

1つ、sedの概念

Sedはストリームエディターです。ストリームエディターは、エディターがデータを処理する前に、事前に提供された一連のルールに基づいてデータストリームを編集します。

sedエディターは、コマンドラインから入力するか、コマンドテキストファイルに保存するコマンドに従って、データストリーム内のデータを処理できます。

第二に、sedのワークフロー

  • sedのワークフローには、主に読み取り、実行、表示の3つのプロセスが含まれます。
    読み取り:sedは、入力ストリーム(ファイル、パイプ、標準入力)からコンテンツの行を読み取り、一時バッファー(パターンスペース、パターンとも呼ばれます)に格納します。スペース)。
    実行:デフォルトでは、すべてのsedコマンドはパターン空間で順番に実行されます。行のアドレスが指定されていない限り、sedコマンドはすべての行で順番に実行されます。
    表示:変更したコンテンツを出力ストリームに送信します。データの送信後、パターンスペースは空になります。すべてのファイルの内容が処理される前に、すべての内容が処理されるまで上記のプロセスが繰り返されます。

すべてのファイルの内容が処理される前に、すべての内容が処理されるまで上記のプロセスが繰り返されます。
注:デフォルトでは、すべてのsedコマンドはパターン空間で実行されるため、リダイレクトを使用して出力を格納しない限り、入力ファイルは変更されません。

3つのsedコマンド形式

  • コマンドフォーマット
格式1:sed  -e  ‘操作’  文件1 文件2 ......

格式2:sed  -n -e  '操作'   文件1  文件2 .......

格式3:sed  -f  脚本文件   文件1  文件2 .......

格式4:sed  -i  -e  '操作'  文件1  文件2.......

格式5:
sed  -e  'n{
操作1 
操作2 
.......
}'  文件1  文件2......
  • 一般的なオプション
-e 或--expression=:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或--help:显示帮助。
-n、--quiet 或 silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
-i:直接修改目标文本文件。
  • 一般的な操作
s:替换,替换指定字符。
d:删除,删除选定的行。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行上面插入一行指定内容。
c:替换,将选定行替换为指定内容。
y:字符转换,转换前后的字符长度必须相同。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

第四に、sedコマンドの使用

1.コンテンツを印刷する

①-nを追加しない場合、sedエディターも1回印刷されます

[root@localhost ~] # vim shuzi.txt
[root@localhost ~] # cat shuzi.txt 
one
two
three
four
five
[root@localhost ~] # sed 'p' shuzi.txt 
one
one
two
two
three
three
four
four
five
five
[root@localhost ~] # sed -n 'p' shuzi.txt 
one
two
three
four
five

②行番号を印刷します。-nを追加すると、sedエディターの出力が制限され、内容が表示されなくなります。

[root@localhost ~] # sed '=' shuzi.txt
1
one
2
two
3
three
4
four
5
five
[root@localhost ~] # sed -n '=' shuzi.txt
1
2
3
4
5

③「;」または-eを使用して複数の操作コマンドを実行します

[root@localhost ~] # sed -n '=;p' shuzi.txt
1
one
2
two
3
three
4
four
5
five
[root@localhost ~] # sed -n -e '=' -e 'p' shuzi.txt
1
one
2
two
3
three
4
four
5
five

補足:一重引用符 "" "の直後に入力してください

[root@localhost ~] # sed -n '
> =
> p
> ' shuzi.txt
1
one
2
two
3
three
4
four
5
five

④ASCII文字を印刷する

[root@localhost ~] # sed -n 'l' shuzi.txt 
one$
two$
three$
four$
five$

2.アドレスを使用する

  • sedエディターには2つのアドレッシングモードがあります。
    • 行間隔を数値形式で表す
    • テキストモードを使用して行を除外する

①印刷ライン

[root@localhost ~] # sed -n '1p' shuzi.txt #打印第一行
one
[root@localhost ~] # sed -n '$p' shuzi.txt #打印最后一行
five
[root@localhost ~] # sed -n '1,3p' shuzi.txt #打印1到3行
one
two
three
[root@localhost ~] # sed -n '3,$p' shuzi.txt #打印3到最后一行
three
four
five
[root@localhost ~] # sed -n '1,+3p' shuzi.txt #打印包括1之后的连续3行
one
two
three
four
[root@localhost ~] # sed '5q' shuzi.txt #输出5行以后退出
one
two
three
four
five

②奇数行を
印刷するステップ1:sedが1行目を読み取り、pが出力する
ステップ2:ここでnは次の行(この時点では2行目)に移動することを意味します
ステップ3:sedコマンドが終了し、に切り替えますもう一度次の行(この時点では3行目です)
ステップ4:最後の行までステップ1、2、3を繰り返します

偶数行の印刷は「n; p」であり、奇数行の印刷と同じです。

[root@localhost ~] # sed -n 'p;n' shuzi.txt #打印奇数行
one
three
five
[root@localhost ~] # sed -n 'n;p' shuzi.txt #打印偶数行
two
four
[root@localhost ~] # sed -n '2,${n;p}' shuzi.txt #打印从2开始的奇数行
three
five

③関連行をフィルタリングして印刷する

 #在/etc/passwd文件中过滤出含有root的行,并打印出来
[root@localhost ~] # sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#从/etc/passwd文件中打印以‘r’开头的行
[root@localhost ~] # sed -n '/^r'/p  /etc/passwd 
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin

#从/etc/passwd文件中打印以‘bash’结尾的行
[root@localhost ~] # sed -n '/bash$'/p  /etc/passwd
root:x:0:0:root:/root:/bin/bash
muhonghuan:x:1000:1000:muhonghuan:/home/muhonghuan:/bin/bash

#打印文件里包含ftp或root的行
[root@localhost ~] # sed -n '/ftp\|root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

#从第二行开始打印到包含ftp的行
[root@localhost ~] # sed -n '2,/ftp/p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

#-r表示支持正则表达式
[root@localhost ~] # sed -nr '/ro{1,}t/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3.行を削除します

①指定した行を削除する

[root@localhost ~] # cat shuzi.txt #查看文件
one
two
three
four
five

#全删后输出,不影响原文件,因为没有重定向
[root@localhost ~] # sed 'd' shuzi.txt 

#删除第3行
[root@localhost ~] # sed '3d' shuzi.txt 
one
two
four
five

#删除2到4行
[root@localhost ~] # sed '2,4d' shuzi.txt 
one
five

#删除最后一行
[root@localhost ~] # sed '$d' shuzi.txt 
one
two
three
four

②指定した行をフィルタリングして削除します

[root@localhost ~] # cat shuzi.txt 
one

two
three


four
five

#删除空行
[root@localhost ~] # sed '/^$/d' shuzi.txt 
one
two
three
four
five
[root@localhost ~] # cat shuzi.txt 
one
two
three
four
five

#删除以e结尾的行
[root@localhost ~] # sed '/e$/d' shuzi.txt 
two
four
#删除不以e结尾的行
[root@localhost ~] # sed '/e$/!d' shuzi.txt 
one
three
five

③以下はご注意ください

つまり、最初の位置から行削除機能をオンにし、2番目の位置まで行削除機能をオフにして、行ごとに削除します。

[root@localhost ~] # cat shuzi.txt 
one
two
three
four
five
#从e开始删除,到h结束,但是后面字符里含有e还会开始删除,直到有h结束
[root@localhost ~] # sed '/e/,/h/d' shuzi.txt 
four

4.交換します

  • フォーマット
行范围  s/旧字符串/新字符串/替换标记
  • 4種類の置換マーカー
    番号:新しい文字列が一致する場所を置き換える
    ことを示しますg:新しい文字列がすべての一致する場所を置き換えることを示します
    p:置換コマンドに一致する行を出力します
    。wファイルを-n :willで使用します。置換のがファイルに書き込まれます
#将第一行的第一个root替换为admin并打印出来
[root@localhost ~] # sed -n 's/root/admin/p' /etc/passwd     
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

#将第一行的第二个root替换为admin
[root@localhost ~] # sed -n 's/root/admin/2p' /etc/passwd   
root:x:0:0:admin:/root:/bin/bash

#替换所有的root
[root@localhost ~] # sed -n 's/root/admin/gp' /etc/passwd 
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

#删除所有的root
[root@localhost ~] # sed -n 's/root//gp' /etc/passwd  
:x:0:0::/:/bin/bash
operator:x:11:0:operator:/:/sbin/nologin

#将1-5行的开头添加#号
[root@localhost ~] # sed '1,5 s/^/#/' /etc/passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#把以root开头的行结尾的$替换为#
[root@localhost ~] # sed -n '/^root/ s/$/#/p' /etc/passwd 
root:x:0:0:root:/root:/bin/bash#

#创建一个用于sed命令的脚本
[root@localhost ~] # vim script.sed 
s/1/22/                                #将1替换为22,下面以此类推
s/5/66/
#然后直接使用该脚本对文件进行操作                        
[root@localhost ~] # sed -f script.sed  file    

#将/etc/passwd中的1-20行输出保存到file.txt文件中
[root@localhost ~] # sed '1,20w file.txt' /etc/passwd  

#将/etc/passwd 中的1-20行的开头添加#后保存到out.txt文件中
[root@localhost ~] # sed '1,20 s/^/#/w out.txt' /etc/passwd      

#将/bin/bash替换成/bin/csh,这里在“/”前面加了转义符“\”是防止“/”具有其他的功能,转义符使其只有普通字符的功能
[root@localhost ~] # sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd #转义符看着很乱,可以使用“!”或者“#”作为字符串的分隔符,作用同上    
[root@localhost ~] # sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd     

補足:sedツールを使用してIPアドレスを照会および抽出します

[root@localhost ~]#/sbin/ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.3  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80::f411:5214:9150:9903  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:46:34:bb  txqueuelen 1000  (Ethernet)
        RX packets 4485  bytes 435517 (425.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1300  bytes 149354 (145.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]#/sbin/ifconfig ens33 | grep 'inet '
        inet 192.168.2.3  netmask 255.255.255.0  broadcast 192.168.2.255

#sed 's/^.*inet //g'用来删除前面的inet部分,即用空字符将其全部替换替换;sed 's/ *netmask.*$//g'   用来删除后面netmask部分,原理同上
[root@localhost ~]#/sbin/ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'   
192.168.2.3

おすすめ

転載: blog.csdn.net/qq_35456705/article/details/112147560