re
re是脚本的基础。用来匹配一系列符合某种句法规则的字符串。
re中有些特殊意义的字符,称为元字符元字符https://www.runoob.com/regexp/regexp-metachar.html
linux
man
不会就man
find
用途:查找文件,处理
语法:
find path [option] [command]
其中option支持按时间,大小,类型,名称等筛选文件,command对find的结果进行后处理,如:
#option:
-mmin n #n分钟前修改过的,+mmin则为n分钟内的
-mtime n #n天前修改过的
-newer file #比file新的
-name pattern #指定文件名,支持*通配符,-iname是忽略大小写
-type d/f/l #类型为dir/file/link的
#command
-delete #删除find的内容
-exec rm -rf {} \; #删除find的内容,并且不需要确认, -ok则需要确认
#operators
#表达式支持使用操作符,如!,and,or等
find . ! -name "xxx" -a ! -name "yyy" #查找除xxx,yyy外的文件
grep
用途:查找文件中的字符
语法:
grep [option] pattern files
option可以控制显示内容,指定pattern种类等,pattern可使用正则表达式,如:
#option
-C n #除了显示匹配行,还会显示前后的n行内容;
-n #显示匹配行号
-P pattern #指定pattern使用的re为Perl-re
-i #忽略pattern大小写
sed
用途:批量处理文件内容
语法:
sed option pattern file
#option
-e #一行有多个命令,如:sed -e 's/aa/bb/g' -e 's/cc/dd/g' file
-i #原位替换,如:sed -i 's/aa/bb/g' file,直接将file中的aa修改为bb,危险动作,-i.bak则可以先备份再修改
-f #从-f指定的文件为pattern,可以解决一些特殊符号的问题
-n #仅显示scrpt处理后的结果,一般和p一起使用
#patern动作
s #替换:sed 'm,ns/old_pattern/new_pattern/g' file,替换m~n行的pattern
p #打印
d #删除:sed '1,2d' file
a #新增add
c #取代
i #插入insert
#批量替换命令
sed -i 's/old_pattern/new_pattern/g' `find . -name "*.sv"`
awk
用途:文本处理
语法:
awk '{[pattern] action}' file # 行匹配语句 awk '' 只能用单引号
#每行按空格或TAB分割,输出文本中的第1、4项
awk '{print $1,$4}' log.txt #这个操作对象是每一行,还可以加上pattern进行行筛选
#默认分隔符是空格或tab,可以使用-F指定分隔符,也可以指定多个分隔符,进行多次分割
awk -F , '{print $1}' log.txt #以,为分隔符,输出第一项
awk -F '[ ,]' '{print $1}' log.txt #以空格和,为分隔符,输出第一项
#-v可以设定变量,以供后面的action使用
awk -v a=1 '{print $1+a} log.txt #第一项+1
#-f可以指定script为文件中的内容,和sed类似
#行筛选支持运算符,包含算数,逻辑运算符,还支持?:,in等操作符
awk '$1>2 && $2=="aa" {print $1,$2} log.txt #第一项>2,并且第二项为aa的行,打印出前两项
vim
批量替换,涉及s,g命令
#s命令,:help :s查询用法
[range]s/{pattern}/string/flag [count]
#range指定范围,
#默认指本行,
#%是所有行,
#m,n是从m~n行,
#'<,'>是visual block行
#pattern可以直接指定字符串,也可以使用正则表达式
#string可以直接指定字符串,也可以使用匹配的内容
#&表示前面pattern匹配的内容
#如果前面pattern使用了捕获组(),string中可以使用\n引用,n:1~9。捕获组按(从左到右排序。
#string可实现大小写转换:\L\1\E(把\1内容全转化为小写,\U则是大写,\l\u则只有首个字母转换)
#flag包含
#c:confirm each substitution;
#g:global,本行所有的匹配;
#i: ingore case;
#n: report the num of matches,可用于统计匹配的次数,如:%s/aaa//ng,统计aaa出现次数
#count指定执行次数,从选定的最后一行开始,不常用
#g命令,:help :g查询用法
[range]g[!]/{pattern}/cmd
#range与s命令类似,默认所有行
#!是反选,g!同vg;
#pattern同s命令;
#cmd包括但不限于:
#d: delete
#m: move
#t: 复制
#s: substitute
#c:confirm
g/xxx/d #删除所有包含xxx的行
1,2g!/xxx/d #1~2行中,删除不包含xxx的行
g/xxx/s/yyy/zzz/ #包含xxx的行中,将yyy替换为zzz
g/xxx/m$ #将包含xxx的行,移动到最后一行,m0则为移动到第一行
其中,s命令中的string项,还可以使用函数式\=来实现算数运算,如数值增减等,可用于波形比较时的文本处理:
1,10s/\d\+/\=submatch(0)+1/g #把1~10行的所有数字,都增大1
#submatch(0)指整个匹配内容:\d\+
'<,'>s/x\(\d\+\)z/\=line(".")-line("'<") #以选中的第一行为基准,将每行的数值从0递增
#submatch(1)则引用的\1,即pattern中的第一个捕获组
s/x\zs\d\zey/\=line(".")-10 #\zs..\ze表示只对中间的\d做替换,外头的x和y不替换
如果函数式中需要实现除法运算,只需将s//改为s##即可。
借助\=还可以实现格式化转化,如进制转换,数值补0,产生数列等。
%s/\d*/\=printf('%08s',submatch(0))/g #不足8位的高位补0
%s/\d\+/\=printf("%X", submatch(0))/g #10进制转化为16进制
%s/\x\+/\=printf("%d", "0x".submatch(0))/g #16进制转10进制
1,10s/^/\=printf("data%02d",line(".")-1) #1~10行,写入data00,data01,...data09
s/^/\=range(1,10) #生成10列数:1,2,...10
s/^/\=range(1,10,2) #生成5列数:1,3,5,7,9