Shell 指定行處理 head、tail、sed
head 前幾行
說明
用於顯示文件開頭部分的內容,從頭開始顯示,默認情況下顯示前10行
基本語法
head filename 查看文件的前10行內容
head -n x filename 查看文件的前x行 / head -n +x filename 查看文件從頭開始到第十行
head -n -10 file.txt 從頭開始,一直顯示到倒數第十行之前
注意
其中n可以直接寫成數字
可以接受管道
tail
說明
用於顯示文件結尾的內容,從尾開始顯示,默認情況下顯示后10行
基本語法
tail 文件 查看文件后10行
tail -n x 文件 查看文件后x行內容
tail -n +x 文件 從開頭的第x行開始顯示到結尾
tail -f 文件 實時追蹤該文件的所有更新。 常用
注意
其中n可以直接寫成數字
可以接受管道指令
sed 刪除、替換、新增、選取
sed本身是一個管道命令,可以分析標准輸入,sed還可以將數據進行替換、刪除、新增、選取特定等功能。
語法
在命令行指定sed指令對文本進行處理
sed 選項 ‘指令’ 處理的文件
sed [-nefr] [[n1,n2] function]
先將sed指令保存到文件中,將該文件作為參數進行調用
sed 選項 -f 包含sed指令的文件 處理的文件文件
-n 一般的用法中,所有來自stdin的數據都會被列出到屏幕,加上-n后,只有經過sed特殊處理的行(或操作(function))才會被列出來
-e 直接在命令行模式上進行sed的操作編輯
-i 直接對內容進行修改,不加-i時默認只是預覽,不會對文件做實際修改
-f 后跟保存了sed指令的文件,-f filename
-r:使用擴展正則表達式
[n1,n2] function
n1,n2 一般代表選擇進行操作的行數,如10行到20行,'10,20'
a add追加 向匹配行后面插入內容
c change更改 更改匹配行的內容
i ins插入 向匹配的行前插入內容
d delet刪除 刪除匹配的內容
s 替換掉匹配的內容
p 打印 打印出匹配的內容,常與-n選項連用
n 讀取下一行,遇到n回自動跳入下一行
= 用來打印被匹配的行的行號
r,w 讀寫命令,r用於將內容讀入文件,w用於將匹配的內容寫入到文檔
案例
刪除行
刪除第2到第5行
[ranan@c107 ~]$ 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
8 halt:x:7:0:halt:/sbin:/sbin/halt
刪除第三行到最后一行,$表示最后一行
[ranan@c107 ~]$ nl /etc/passwd | sed '3,$d'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
從第一行開始刪除,每隔2行就刪除一行,刪除奇數行
[ranan@c107 ~]$ nl /etc/passwd | sed '1~2d'
刪除1~2之外的所有行
[ranan@c107 ~]$ nl /etc/passwd | sed '1,2!d'
刪除從第一個匹配到的行到最后一行
[ranan@c107 ~]$ last -5
ranan pts/2 192.168.10.1 Mon Dec 6 15:20 still logged in
ranan pts/1 192.168.10.1 Mon Dec 6 12:26 still logged in
ranan pts/0 192.168.10.1 Mon Dec 6 11:06 still logged in
ranan pts/0 192.168.10.1 Sun Dec 5 21:05 - 10:03 (12:58)
reboot system boot 4.18.0-240.22.1. Sun Dec 5 21:04 still running
wtmp begins Sun May 23 20:25:21 2021
[ranan@c107 ~]$ last -5 | sed '/reboot/,$d'
ranan pts/2 192.168.10.1 Mon Dec 6 15:20 still logged in
ranan pts/1 192.168.10.1 Mon Dec 6 12:26 still logged in
ranan pts/0 192.168.10.1 Mon Dec 6 11:06 still logged in
ranan pts/0 192.168.10.1 Sun Dec 5 21:05 - 10:03 (12:58)
刪除空行
[ranan@c107 ~]$ last -5 | sed '/^$/d'
刪除1-3行中,匹配內容123的行,1,3表示匹配1-3行,{/123/d}表示刪除匹配123的行
sed '1,3{/123/d}' 1.txt
插入行
插入多行用\分隔
[ranan@c107 ~]$ last -5 | sed '2a hellow\
> bb' #注意需要回車
ranan pts/2 192.168.10.1 Mon Dec 6 15:20 still logged in
ranan pts/1 192.168.10.1 Mon Dec 6 12:26 still logged in
hellow
bb
ranan pts/0 192.168.10.1 Mon Dec 6 11:06 still logged in
ranan pts/0 192.168.10.1 Sun Dec 5 21:05 - 10:03 (12:58)
reboot system boot 4.18.0-240.22.1. Sun Dec 5 21:04 still running
在包含ranan 的行之后插入hello,如果有多行,都會添加
[ranan@c107 ~]$ last -5 | sed '/ranan/ahello'
ranan pts/2 192.168.10.1 Mon Dec 6 15:20 still logged in
hello
ranan pts/1 192.168.10.1 Mon Dec 6 12:26 still logged in
hello
ranan pts/0 192.168.10.1 Mon Dec 6 11:06 still logged in
查看某行
查看並打印出來
[ranan@c107 ~]$ nl /etc/passwd | sed -n '2,3p'
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
替換某行
[ranan@c107 ~]$ nl /etc/passwd | sed '2,3c ranan'
1 root:x:0:0:root:/root:/bin/bash
ranan
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
包含ranan的行都替換為hello
[ranan@c107 ~]$ last -5 | sed '/ranan/chello'
hello
hello
hello
hello
reboot system boot 4.18.0-240.22.1. Sun Dec 5 21:04 still running
部分數據的查找並替換
sed 's/要被替換的字符/新的字符/g'
g 表示每一行的所有都替換了,默認只替換每行的第一個
一行一行進行查找替換
在last的每一行開頭加一個#
[ranan@c107 ~]$ last -5 | sed '/^$/d'
ranan pts/2 192.168.10.1 Mon Dec 6 15:20 still logged in
ranan pts/1 192.168.10.1 Mon Dec 6 12:26 still logged in
ranan pts/0 192.168.10.1 Mon Dec 6 11:06 still logged in
ranan pts/0 192.168.10.1 Sun Dec 5 21:05 - 10:03 (12:58)
reboot system boot 4.18.0-240.22.1. Sun Dec 5 21:04 still running
wtmp begins Sun May 23 20:25:21 2021
[ranan@c107 ~]$ last -5 | sed '/^$/d'|sed 's/^/#/g'
#ranan pts/2 192.168.10.1 Mon Dec 6 15:20 still logged in
#ranan pts/1 192.168.10.1 Mon Dec 6 12:26 still logged in
#ranan pts/0 192.168.10.1 Mon Dec 6 11:06 still logged in
#ranan pts/0 192.168.10.1 Sun Dec 5 21:05 - 10:03 (12:58)
#reboot system boot 4.18.0-240.22.1. Sun Dec 5 21:04 still running
#wtmp begins Sun May 23 20:25:21 2021
將每行中第二個匹配的123替換為hello
[ranan@c107 ~] sed 's/123/hello/2' 1.txt
讀寫操作
將每行中所有匹配的123替換為hello,並將替換后的內容寫入2.txt
[ranan@c107 ~]$sed -n 's/123/hello/gpw 2.txt' 1.txt