一、sed的使用
Usage: sed [OPTION]… {script-only-if-no-other-script} [input-file]…
参数:
- -n : 使用安静输出模式
- -e : 直接在命令列模式上进行sed的动作编辑
- -f :直接将sed的动作写在一个文件内
- -i[SUFFIX], --in-place[=SUFFIX] : 直接修改读取的文件内容,而不是输出到终端
- -c, --copy : 在-i模式下移动文件时,使用copy代替rename
- -b, --binary : 兼容二进制文件
- -l N, --line-length=N : 行数
- -r, --regexp-extended : 使用正在表达式
- -s, --separate : 将文件视为各个独立的文件而不是一个长的联系连续输入
- -u, --unbuffered : 从输入文件读取最少的数据,更频繁的刷新输出
- -h, --help : 帮助信息
- -version : 版本信息
动作:
- a:新增
- c:取代
- d:删除
- i:插入
- p:打印
- s:取代
1.删除字符或特定字符前后字符
# 删除前两字符
sed 's/../' aa.txt
# 删除前7个字符
sed 's/.\{7\}//' aa.txt
## 删除最后两个字符
sed 's/..$//' aa.txt
## 删除指定字符":"前两个字符和后两个字符
sed 's/..:..//'
2.删除使用
## 删除某行,没有加-i参数的时候都是不会修改文本内容
sed '3d' aa.txt
## 删除第10到最后一行
sed '10,$d' aa.txt
## 删除所有包含指定字符test的行
sed '/test/d' aa.txt
3.打印
## 打印第n行,sed -n 'np' aa.txt
## 打印第三行
sed -n '3p' aa.txt
## 打印3~5行
sed -n '3,5p' aa.txt
## 打印从第3行到最后一行
sed -n '3,$p' aa.txt
4.替换
## 将所有test替换成check
sed 's/test/check/g' aa.txt
替换中有g和没有g的区别:
- 有g:替换所有
- 没有g:只替换每行第一个匹配的
二、awk的使用
使用语法:
awk -f|-F|-v {command;command} 文件
- -f:调用脚本
- -F:分隔符
- -v:变量定义
特定字符含义说明:
- $0:当前行
- $1:每行的第一个字段
- NF:字段数量变量
- NR:行号
- FNR:与NR类似,不过文件记录不递增,每个文件都是的从1开始记录
- FS:定义分隔符
- RS:输入的记录分隔符,默认为换行符
- -F’[多个分隔符]’:定义多个分隔符,如-F’[:\t|]’
- OFS:输出字段分隔符,默认是空格
- ORS:输出的记录分隔符,默认是换行符
- &&:逻辑与
- ||:逻辑或
- ~:非精确匹配
- ==:精确匹配
- !~:不匹配,非精确
- !=:不等于,精确比较
1.获取某范围时间段的日志信息
## 以# 2022-02开头的在04:30~05:10范围的时间
awk '/^2022-02/ {slow=($NF>"04:30:00.000000+00" && $NF<"05:10:00.000000+00")}slow' slow.log
## 以2022-02-05开头的,时间范围在8点的日志信息
egrep "^2022-02-05 08:[00-59]+.*" xxx.log > aa.log
2.条件表达式
## if条件语句,必须用在{}中,且比较内容需要用小括号()扩起来
awk -F '|' '{if($1~/2022-02-11/) print $1}' aa.txt
## if...else
awk -F '|' '{if($1~/2022-02-11/) print $1 else {print $2}}' aa.txt
## 运算比较
awk '$1<="2022-02-11"{print $1}' aa.txt
3.while使用
## while循环
awk -F '|' 'BEGIN{i=1} {while(i<NF) print NF,$i,i++}' aa.txt