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 'ahello world' advance.txt
sed '/hj/ahello world' advance
/hj/ 表示匹配模式,匹配后在后面插入hello world
sed -r '/正则表达式/命令/命令的参数' 文件
sed '3,4chello 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 '/[wW]*?(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 技巧
# 打印行号
awk `END{print NR}` filename
# 打印文本最后一行的内容
awk 'END{print $0}' filename
# 打印文本列数
awk 'END{print NF}' filename