linux中sed命令用法,sed 以及 awk用法

 2023-12-06 阅读 20 评论 0

摘要:   sed 格式 sed[options] "script" FILE.... 選項: -n:靜默模式,不輸出模式空間內的內容;默認打印空間模式的內容 -r:擴展的正則表達式 -f 文件:指定sed腳本文件 -e 'script' -e 'script' :指定多個編輯

  

sed 格式
sed[options] "script" FILE....

選項:
-n:靜默模式,不輸出模式空間內的內容;默認打印空間模式的內容
-r:擴展的正則表達式
-f 文件:指定sed腳本文件
-e 'script' -e 'script' :指定多個編輯指令
-i : 直接編輯原文件


編輯命令:
d:刪除
p: 打印
i \text:在被指定到的行前面插入文本
a \text:在被指定的行的下面插入文本
\n:換行
r /path/file.txt:在指定位置把另外一個文件的內容插入
w /path/file.txt:將符合條件的所有行保存至指定文件中
=:顯示符號條件的行的行號
s///:查找條件可以使用模式,但是要替換的內容不行

?

sed '地址定界s@查找條件@替換文件@'
修飾符:
g:global,全局替換
i:ignore-case,不區分字符大小寫

?

?

?

地址定界:自定義的起始行到結束行
startline,endline
1,3
/pat1/,/pat2/
/pattern/

用法:sed [options] 'addr1[,addr2]編輯命令' FILE...
sed [options] "addr1[,addr2]編輯命令" FILE...

用法

1. 刪除 /etc/puppet/puppet.conf 1到13行的數據
[root@k8s1 ~]# sed '1,13d' /etc/puppet/puppet.conf

2. 刪除以空格或者tab的集合開頭的行
[root@k8s1 ~]# sed '/^[[:space:]]/d' /etc/puppet/puppet.conf?

3.刪除空行
[root@k8s1 ~]# sed '/^[[:space:]]*$/d' /etc/puppet/puppet.conf

4.刪除fstab中以/ 開頭的行。
[root@k8s1 ~]# sed '/^\//d' /etc/fstab

5.刪除第2行到第一次出現 / 的行,結束是在/ 行后
[root@k8s1 ~]# sed '2,/^\//d' /etc/fstab

6.刪除以 # 開始到第一次出現 / 的行,結束是在/ 行后
[root@k8s1 ~]# sed '/^#/,/^\//d' /etc/fstab
7.顯示打印以 # 開始到第一次出現 / 的行,結束是在/ 行后
[root@k8s1 ~]# sed -n '/^#/,/^\//p' /etc/fstab
8.在空行前添加 11111111111111 
[root@k8s1 ~]# sed '/^$/i \111111' /etc/fstab
[root@k8s1 ~]# sed '/^[[:space:]]*$/i \111111' /etc/fstab
9.在空行后添加 11111111111111 
[root@k8s1 ~]# sed '/^$/a \111111' /etc/fstab
[root@k8s1 ~]# sed '/^[[:space:]]*$/a \111111' /etc/fstab

10.在大寫字母后添加2行
[root@k8s1 ~]# sed '/^[[:upper:]]/a \aaaaaaaaaaa\nbbbbbbbbb' /etc/issue

11. 在一個大寫字母行后,把另一個文件內容追加進來。
[root@k8s1 ~]# sed '/sda2/r /etc/issue' /etc/fstab

12. 將fstab 中包含 / 的保存在/tmp/file.txt中
sed '/\//w /tmp/file.txt' /etc/fstab

13.顯示匹配的行號
[root@k8s1 ~]# sed '/\//=' /etc/fstab

14. 把 /etc/issue內容 添加到fstab 第2行后
[root@k8s1 ~]# sed ?'2r /etc/issue' /etc/fstab

list.txt 文件內容如下:

  docker:x:996:993:Docker User:/var/lib/docker:/sbin/nologin
  etcd:x:995:992:etcd user:/var/lib/etcd:/sbin/nologin
  puppet:x:52:52:Puppet:/var/lib/puppet:/sbin/nologin
  centos:x:2000:2000::/home/centos:/bin/bash
  nginx:x:990:9909:Nginx web server:/var/lib/nginx:/sbin/nologin

?

 15.刪除一行中出現相同docker的行
 [root@k8s1 ~]# sed '/\(d.*r\).*\1/d' list

??16.刪除一行中出現相同字符的行
 [root@k8s1 ~]# sed '/\(*.\).*\1/d' list

17.替換第二個docker為Docker
[root@k8s1 ~]#?sed ?'/\(d.*r\).*\1/s@dockeri@Dockeri@' ?list

18.替換 /etc/inittab 中 id:3:initdefault 變成數字5
[root@python tmp]# sed '/id:/s@[0-9]@5@' /etc/inittab

19.替換/etc/inittab 中 以#開頭和后面有空格的行
[root@python tmp]# sed '/^#/s@^#[[:space:]]\{0,1\}@@g' inittab

20.刪除/etc/inittab 中所有開頭是空白的行
sed 's@^[[:space:]]\{1,\}@@g'? /etc/inittab


?

?

awk命令:
awk:報告生成工具
把文件中讀取帶的每一行的每個字段分別進行格式化,而后進行顯示:

支持使用變量、條件判斷、循環、數組

?

選項:
  -F:切割符
  $0:整行
  $1,$2.....:位置參數


用法格式:
awk [options] 'script' FILE...
awk [options] '/pattern/{action}' FILE...

action: print $1,$2

[root@k8s1 ~]# awk -F":" '{print $1}'  /etc/passwd

?

模式:
  地址定界:/pat1/,/pat2/ 一個范圍 ? ? ? ?
  /pattern/ 被匹配到的行


  experssion 表達式 ? $3 > 2000
  >,>=,<,<=,==,!=,~(模式匹配)


  BEGIN:在遍歷操作開始之前執行一次: ? awk 'BEGIN{print "name"}{print $1,$2}'
  END:在遍歷操作結束之后,命令退出之前退出一次。 ???awk 'BEGIN{print "name"}{print $1,$2}END{print “----------”}'

?

awk的常用四種分隔符:
輸入:
  行分隔符
  字段分隔符
輸出:
  行分隔符
  字段分隔符


awk內置變量之數據變量:
NR: The number of input records,awk命令所處理的記錄數;如果有多個文件,這個數目會把處理的多個文件中行統一計數;
NF:Number of Field,當前記錄的field個數;
FNR: 與NR不同的是,FNR用于記錄正處理的行是當前這一文件中被總共處理的行數;
ARGV: 數組,保存命令行本身這個字符串,如awk '{print $0}' a.txt b.txt這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC: awk命令的參數的個數;
FILENAME: awk命令所處理的文件的名稱;在命令中獲取當前文件名
ENVIRON:當前shell環境變量及其值的關聯數組;

?

?

[root@k8s1 ~]# awk -F":" '/centos/{print $0}'  /etc/passwd
centos:x:
2000:2000::/home/centos:/bin/bash

?[root@k8s1 ~]# awk -F":" '/12/{print $0}' /etc/passwd
?mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
?games:x:12:100:games:/usr/games:/sbin/nologin

?

?[root@k8s1 ~]# awk -F":" '$3>2000 {print $0}' /etc/passwd
?suse:x:3000:3000::/home/suse:/bin/bash

?

[root@k8s1 ~]# awk 'BEGIN{print "name:-------"}{print $1} END{print "-----------------"}' /etc/passwd
name:-------

......

----------

?

顯示最后一列

[root@k8s1 ~]# awk -F":" '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin

?

輸入按照:號切割,輸出按照+號顯示

[root@k8s1 ~]# awk 'BEGIN{FS=":";OFS="+"}{print $1,$7}' /etc/passwd

root+/bin/bash

?

使用NR 顯示總行數

[root@k8s1 ~]# awk '{print NR,$0}' /etc/passwd ?/etc/fstab

?

使用FNR 對每個文件計數

[root@k8s1 ~]# awk '{print FNR,$0}' /etc/passwd ?/etc/fstab

?

ARGV[0] 等于awk,ARGV[1]等于/etc/passwd,但是會循環顯示 /etc/passwd

[root@k8s1 ~]# awk -F ":" '{print ARGV[0]}' /etc/passwd

可以使用BEGIN,在循環前執行

[root@k8s1 ~]# awk 'BEGIN{print ARGV[0]}'

[root@k8s1 ~]# awk -F":" '{print $1“ is a user in ”ARGV[1]}' /etc/passwd

?

FILENAME: awk命令所處理的文件的名稱;在命令中獲取當前文件名

[root@k8s1 ~]# awk '{print $0" in "FILENAME}' /etc/passwd

?

使用-v 自定義變量,或者直接在BEGIN中定義

[root@k8s1 ~]# awk -v num1=30 -v num2=30 ?'BEGIN{print num1+num2}'

[root@k8s1 ~]# awk 'BEGIN{num1=20;num2=30; print num1+num2}'

?

?

條件表達式 if?

?

print 的區別,一個對整個行操作,一個在操作行之前操作

[root@k8s1 ~]# awk 'BEGIN{num1=231;num2=500;num1>num2?max=num1:max=num2;print max}'
500

[root@k8s1 ~]# awk 'BEGIN{num1=30;num2=55;num1>num2?max=num1:max=num2} {print max}' /etc/passwd
?

?

printf

printf命令的使用格式:
printf format, item1, item2, ...

要點:
1、其與print命令的最大不同是,printf需要指定format;
2、format用于指定后面的每個item的輸出格式;
3、printf語句不會自動打印換行符;\n

format格式的指示符都以%開頭,后跟一個字符;如下:
%c: 顯示字符的ASCII碼;
%d, %i:十進制整數;
%e, %E:科學計數法顯示數值;
%f: 顯示浮點數;
%g, %G: 以科學計數法的格式或浮點數的格式顯示數值;
%s: 顯示字符串;
%u: 無符號整數;
%%: 顯示%自身;

修飾符:
N: 顯示寬度;
-: 左對齊;
+:顯示數值符號;

例子:

[root@k8s1 ~]# awk -F":" '{printf "%-20s %s\n",$1,$NF}' /etc/passwd
??

?

[root@k8s1 ~]# awk 'BEGIN{sum=55;printf "%d\n",sum}'
55

?


常見的模式類型:


1、Regexp: 正則表達式,格式為/regular expression/
2、expresssion: 表達式,其值非0或為非空字符時滿足條件,如:$1 ~ /foo/ 或 $1 == "magedu",用運算符~(匹配)和!~(不匹配)。
3、Ranges: 指定的匹配范圍,格式為pat1,pat2
4、BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次
5、Empty(空模式):匹配任意輸入行;

?


/正則表達式/:使用通配符的擴展集。

關系表達式:可以用下面運算符表中的關系運算符進行操作,可以是字符串或數字的比較,如$2>%1選擇第二個字段比第一個字段長的行。

模式匹配表達式:

模式,模式:指定一個行的范圍。該語法不能包括BEGIN和END模式。

BEGIN:讓用戶指定在第一條輸入記錄被處理之前所發生的動作,通常可在這里設置全局變量。

END:讓用戶在最后一條輸入記錄被讀取之后發生的動作。

?

?

控制語句:
1 if-else
語法:awk '{if (condition) {then-body} else {[ else-body ]}}'
#?

?

[root@k8s1 ~]# awk '{if ($3==0) {print $1, "Adminitrator";} else { print $1,"Common User"}}' /etc/passwd
[root@k8s1 ~]# awk -F":" '{if ($3==0) {printf "%-18s $s\n",$1,"is administrator"} else {printf "%-18s %s\n",$1,"is comm user"}}' /etc/passwd
??

?

? 統計匹配的行,sum++ 就是循環一次,自身加1

[root@k8s1 ~]# awk -F: -v sum=0 '{if ($3>500) {sum++}} END{print sum}' ?/etc/passwd
[root@k8s1 ~]# awk -F":" 'BEGIN{sum=0} {if($4="192.168.2.1") {sum++}} END{print sum}' fengjian

?

while
語法:awk ?'{i=1; while (i<5) {print $i;i++}}' ?file

[root@k8s1 ~]# awk -F":" '{i=1; while(i<NF) {printf "%s:",$i;i++} ;printf "\n"}' /etc/passwd
?

?

[root@k8s1 ~]# awk -F":" '{i=1; while(i<NF) {if($i==3000) {print $i};i++}}' /etc/passwd
??
 

?

?

for
語法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}

[root@k8s1 ~]# awk -F":" '{for(i=1;i<=NF;i++){printf "%s:",$i};printf "\n"}' /etc/passwd

?

?

[root@k8s1 ~]# awk -F":" '{for(i=1;i<=NF;i+=2){printf "%s:",$i};printf "\n"}' /etc/passwd

??

?

 

?

?

for循環還可以用來遍歷數組元素:
語法: for (i in array) {statement1, statement2, ...}
awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n",A,BASH[A]}}' /etc/passwd

?

array[index-expression]

index-expression可以使用任意字符串;需要注意的是,如果某數據組元素事先不存在,那么在引用其時,awk會自動創建此元素并初始化為空串;因此,要判斷某數據組中是否存在某元素,需要使用index in array的方式。

要遍歷數組中的每一個元素,需要使用如下的特殊結構:
for (var in array) { statement1, ... }
其中,var用于引用數組下標,而不是元素值;

例子:
netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
每出現一被/^tcp/模式匹配到的行,數組S[$NF]就加1,NF為當前匹配到的行的最后一個字段,此處用其值做為數組S的元素索引;

awk '{counts[$1]++}; END {for(url in counts) print counts[url], url}' /var/log/httpd/access_log
用法與上一個例子相同,用于統計某日志文件中IP地的訪問量

?

從關系數組中刪除數組索引需要使用delete命令。使用格式為:

delete array[index]

[root@haproxy1 ~]# netstat -an | awk '/^tcp/{state[$NF]++} END{for(A in state) {print A,state[A]}}'

?

統計非空白行訪問IP的數量

[root@tracker1 logs]# awk '!/^!/{ACCESS[$1]++} END{for(a in ACCESS) {print a,ACCESS[a]}}' access.log

?

統計訪問的路徑

[root@S1PW003 logs]# awk '/GET/{res[$7]++} END{for(i in res) {print i,res[i]}}' access.log

?

統計varnish狀態碼?

[root@haproxy1 logs]# awk '/varnish/{code[$11]++} END{for(i in code) {print i,code[i]}}' haproxy_http.log

??

?

顯示為基數的行/etc/passwd,使用next

[root@k8s1 ~]# awk -F":" '{if($3%2==0) {next} else {print $1,$3}}' /etc/passwd

?

?統計當前系統上每個客戶端IP的連接中處于TIME_WAIT的連接狀態的個數;

[root@xinyixy_pc_006 ~]# netstat -an | awk '/TIME_WAIT/{laststr[$NF]++} END{for(i in laststr) {print i,laststr[i]}}'

?

統計ps aux命令執行時,當前系統上各用戶的進程的個數;

root@xinyixy_pc_006 ~]# ps aux | awk '{state[$8]++}END{for(i in state) {printf "%-15s %s\n",i,state[i]}}'

?

?

awk的內置函數

awk '{split(分割的字段, 數組名稱 ,分割符)'}


功能:將string表示的字符串以fieldsep為分隔符進行分隔,并將分隔后的結果保存至array為名的數組中;數組下標為從1開始的序列;

# netstat -ant | awk '/:80\>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50

# netstat -tan | awk '/:80\>/{split($5,clients,":");ip[clients[4]]++}END{for(a in ip) print ip[a],a}' | sort -rn | head -50

# df -lh | awk '!/^File/{split($5,percent,"%");if(percent[1]>=20){print $1}}'

[root@xinyixy_ha_001 ~]# netstat -anpt | awk '{split($7,program,"/");res[program[2]]++} END{for(i in res) {print res[i],i}}'

?

?

length([string])
功能:返回string字符串中字符的個數;


substr(string, start [, length])
功能:取string字符串中的子串,從start開始,取length個;start從1開始計數;

system(command)
功能:執行系統command并將結果返回至awk命令

systime()
功能:取系統當前時間

tolower(s)
功能:將s中的所有字母轉為小寫

toupper(s)
功能:將s中的所有字母轉為大寫

轉載于:https://www.cnblogs.com/fengjian2016/p/6835054.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/191713.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息