常用脚本总结

re

re是脚本的基础。用来匹配一系列符合某种句法规则的字符串。

re中有些特殊意义的字符,称为元字符元字符icon-default.png?t=N7T8https://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

perl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值