shell⾼级操作
shell ⾼级操作
shell ⽂件增删改查
sed
sed 是linux中提供的⼀个外部命令,它是⼀个⾏(流)编辑器,⾮交互式的⽂件内容进⾏增删改查的操作,
使⽤者只能在命令⾏输⼊编辑命令、指定⽂本名,然后再屏幕上查看输出。
区别:
⽂本编辑器:编辑对象是⽂本
⾏编辑器:编辑对象是⽂件中的⾏
sed原理
数据在缓存中处理,然后输出到屏幕,不会修改源⽂件。
sed 命令
sed [options] '{command}[flags]' [filename]
[] 可选的
{} 必须的
options --对sed命令的补充
-e script 将脚本中指定的命令添加到处理输⼊时执⾏的命令中多条件,⼀⾏中要有多个操作
⽐如:sed -e 's/brow/green/;s/dog/cat/'
->  第⼀个指令;第⼆个指令
-f script 将⽂本中指定的命令添加到输⼊时的命令中
将命令以换⾏的⽅式写⼊⼀个⽂件⾥⾯,然后直接使⽤该⽂件中的指令,如-e的改为file
s/brow/green/
s/dog/cat/
-n 抑制⾃动输出
-i 编辑⽂件内容
-i.bak 修改时同时创建.bak备份⽂件
-r 使⽤扩展的正则表达式
! 取反 (跟在模式条件后与shell有所区别)
⽰例
sed 'a\hello world'
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'
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/meminfoshell创建文件并写入内容
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}' 
# 打印第3⾏全⾏
awk 'NR==3{print $0}' 
# 以.为分隔符并打印第⼆列
awk -F "." 'NR==1{print $2}'
# 以.变为分隔符,并且将.变为:号显⽰
awk -F "." 'NR==1{print $1 ":" $2}'
awk -F ":" 'NR==1{print "URSER:" $1 " PATH:" $6}' /etc/passwd
awk⾼级⽤法
BEGIN 处理数据流之前做什么
program 处理数据流做什么
END 处理之后做什么
# 下⾯是开始和结束时命令,都写在⼀个''中
awk 'BEGIN{print "Hello World"}END{print "Exit"}'
特性
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}'
# while
awk '{sum=0;i=1;while(i<4){sum+=$i;i++;print $i}print sum}'
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

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