shell 高級操作
shell 文件增刪改查
sed
sed 是linux中提供的一個外部命令,它是一個行(流)編輯器,非交互式的文件內容進行增刪改查的操作,
使用者只能在命令行輸入編輯命令、指定文本名,然后再屏幕上查看輸出。
區別:
文本編輯器:編輯對象是文本
行編輯器:編輯對象是文件中的行
sed原理
數據在緩存中處理,然后輸出到屏幕,不會修改源文件。
sed 命令
sed [options] '{command}[flags]' [filename]
[] 可選的
{} 必須的
options --對sed命令的補充
-e script 將腳本中指定的命令添加到處理輸入時執行的命令中 多條件,一行中要有多個操作
比如:sed -e 's/brow/green/;s/dog/cat/' data.txt
-> 第一個指令;第二個指令
-f script 將文本中指定的命令添加到輸入時的命令中
將命令以換行的方式寫入一個文件里面,然后直接使用該文件中的指令,如-e的改為file
s/brow/green/
s/dog/cat/
-n 抑制自動輸出
-i 編輯文件內容
-i.bak 修改時同時創建.bak備份文件
-r 使用擴展的正則表達式
! 取反 (跟在模式條件后與shell有所區別)
示例
sed 'a\hello world' advance.txt
sed '/hj/a\hello world' advance
/hj/ 表示匹配模式,匹配后在后面插入hello world
sed -r '/正則表達式/命令/命令的參數' 文件
sed '3,4c\hello world' advance 將3,4行更改為hello world
sed '1,3y/abc/ABC/' advance
command
a 在匹配后面添加
i 在匹配前面添加
p 打印
d 刪除
s 查找替換
c 更改
y 轉換 N D P,
flags 對命令的補充
數字: 表示新文本替換的模式
g: 表示用新文本替換現有文本的全部實例
sed 'g/dog/cat/p' data.txt
p: 表示打印原始內容
w filename 將替換結果寫入文件中
技巧
sed -n '$=' filename 統計文件行號
sed -n -r '/[\w\W]*?(bash)/p' filename.sh 正則
shell對輸出流的處理 awk
從輸出流中,把我們的數據找出來,並且對這些數據進行處理,awk默認設計時是一門語言
awk是一種可以處理數據、產生格式化報表的語言,功能十分強大。awk認為文件中的每一行是一條記錄,記錄與記錄的分隔符為換行符,每一列是一個字段,字段與字段的分隔符默認是一個或多個空格或tab制表符。
awk的工作方式是讀取數據,將每一行數據視為一條記錄,每條記錄以字段分隔符分成若干字段,然后輸出各個字段的值。
head -3 /proc/meminfo
AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。
之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
awk語法
awk [options] [BEGIN]{program}[END] [file]
options
-F fs 指定描繪一行中的數據字段的文件分割,默認為空格
-f file 指定讀取程序的文件名
-v var=value 指定awk程序中使用的變量和默認值
注意:awk 程序腳本由左大括號和右大括號定義。腳本命令必須放置在大括號之間。
awk程序運行優先級是:
1.BENGIN 在開始處理數據流之前執行,可選項
2.program 如何處理數據流,必選項
3.END 處理完數據流后執行,可選項
awk基本用法--awk數據提取功能
$0 表示整行文本
$1 表示文本行中的第一個數據字段
$2 表示文本行中的第二個數據字段
$N 表促成文本中的第N個數據字段
$NF 表示文本行中的最后一個數據字段
# 打印第1行
awk '{print $1}' data.txt
# 打印第3行全行
awk 'NR==3{print $0}' data.txt
# 以.為分隔符並打印第二列
awk -F "." 'NR==1{print $2}' data.txt
# 以.變為分隔符,並且將.變為:號顯示
awk -F "." 'NR==1{print $1 ":" $2}' data.txt
awk -F ":" 'NR==1{print "URSER:" $1 " PATH:" $6}' /etc/passwd
awk高級用法
BEGIN 處理數據流之前做什么
program 處理數據流做什么
END 處理之后做什么
# 下面是開始和結束時命令,都寫在一個''中
awk 'BEGIN{print "Hello World"}END{print "Exit"}' data.txt
特性
awk是一門語言,可以定於變量,定義數組,進行運算,流程控制等
定義變量
# t=$2 表示定義變量t
head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print (1-(t-(t-f))/t)*100 "%"}'
# 定義數組
awk 'BEGIN{array[1]="year";array[2]="2021";print array[1] ":" array[2]}'
awk 運算
echo 5|awk '$1==5{print "true"}'
echo 5|awk '$1==5{print 1+1}'
echo 5 5|awk '$1==$2{print "true"}'
awk 環境變量
FIELDWIDTHS 以空格分隔的數字列表,用空格定義每個數據字段的精確寬度
FS 輸入字段分隔符號
OFS 輸出字段分隔符號
RS 輸入記錄分隔符號
ORS 輸出記錄分割符號
# BEGIN中設置分隔符為:,輸出分隔符為:,輸出3列,每列兩個字符,$1默認為每個分隔符的值
awk 'BEGIN{FS=":";OFS="-";FIELDWIDTHS="2 2 2"}NR==1{print $1,$2,$3}' /etc/passwd
ro ot :x
awk 流程控制
echo ddd|awk '{if($1>5)print $0}'
echo dd|awk -v 'sum=0' '{sum+=$1}END{print sum}'
# 每統計后,輸出結果 for
awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' number.txt
# while
awk '{sum=0;i=1;while(i<4){sum+=$i;i++;print $i}print sum}' number.txt
awk 字符串拼接
#字符串使用 name=(a""b);
# 如果使用+號連接,則表示只處理整數
nmcli connection show|grep eth0|awk '{netName=""; for(i=1;i<=NF-3;i++){netName=(netName""$i); if(i!=3){netName=(netName" ");}} print netName}'
awk 技巧
# 打印行號
awk `END{print NR}` filename
# 打印文本最后一行的內容
awk 'END{print $0}' filename
# 打印文本列數
awk 'END{print NF}' filename