sed
参数解析
- -i : 表示将改变直接写入原文件, sed默认只修改输出到终端上的内容
- -f : -f file1 表示将sed 的操作都输出到file1
- -n : slient模式, 默认情况下sed所有来自STDIN的数据都会输出到终端,-n只会将”来自sed的操作”输出到终端, 一般和p一起用;
- -e : 表示使用正则匹配
example
- 替换全部:
sed "s/aaa/bbb/g" -i file
- 每行开头插入#号:
sed "s/^/#/g" -i file
- 只在3-6行替换:
sed "3,6s/aaa/bbb/g" -i file
- 只替换每行的第1处aaa:
sed "s/aaa/bbb/1" -i file
- 只替换每行的第2处aaa:
sed "s/aaa/bbb/2" -i file
- 替换每行第3-最后一处aaa:
sed "s/aaa/bbb/3,g" -i file
- 正则替换:
sed -e 's/^#\s*\(.*[0-9].*\)$/\1/g' filename
- 与find联用:
find ./ -type f -exec sed -i -e 's/aaa/bbb/g' {} \;
awk
参数解析
- 命令格式:
awk [options] 'script' file_name
:awk [options] -f scriptfile file_name
cat file_name | awk [options] script
[options]选项有:
-F
: 指定分隔符. 分隔符默认是空格awk -F:
表示冒号作为分隔;awk -F"[@ /t]"
告诉awk “@符号, 空格和Tab” 都是字段分隔符.
-v
: 赋值一个用户定义变量, 传递给scripts, 例-v var=value
-f
: 从指定文件中读取 awk scripts, 例-f scripfile
awk脚本
基本语法
- 基本用法:
awk 'script' filename
,该脚本 ‘script’ 中内容的格式是/pattern/ action
,其中 pattern 是一个正则表达式,而 action 是当 awk 在该行中找到此模式时应当执行的动作。- 例1:
awk '/local*/{print $0}' /etc/hosts
- 例2:
- 例1:
内建变量
NF
: 表示目前的记录被分割的字段的数目,NF可以理解为 Number of Field。awk '{print FNR}' data.txt
会打印出字段个数 (默认是任何数量的空格);$NF
: 表示的最后一个Field(列)即输出最后一个字段的内容;NR
: 已经读出的记录数,即行号,从1开始;$n
: 表示目前的记录被分割后, 第n个字段的内容;
example 1
提取每行符合正则的字符串
awk 'match($0, /meeting_code[0-9]+/,a){print a[0]}' test.log
// 提取格式如 ‘meeting_code0000’ 的字符串,如果在mac上报错,试试gawk注: match函数原型
match(string,regexp,array)
每个进程打开的文件数:
lsof | awk '{process[$1]++;} END{for(key in process) printf("%s:%d\n", key, process[key])}'
- 打开TCP连接数量:
lsof | awk '{if($8 == "TCP") opened_tcp++} END{print opened_tcp }'
- 打开文件按TYPE统计:
lsof | awk '{opened_type[$5]++} END{ for(key in opened_type) printf("%s : %d\n", key, opened_type[key])}'
example 2
- awk多维数组在本质上是一维数组, 因awk在存储上并不支持多维数组, awk提供了逻辑上模拟二维数组的访问方式. 例如, array[2,3] = 1这样的访问是允许的.
awk使用一个特殊的字符串SUBSEP (\034)作为分割字段, 在上面的例子 array[2,3] = 1 中, 关联数组array存储的键值实际上是2\0343, 2和3分别为下标(2, 3), \034为SUBSEP分隔符 - 类似一维数组的循环访问, 多维数组使用
for ( item in array )
语法遍历数组. 与一维数组不同的是, 多维数组必须使用split()
函数来访问单独的下标分量, 格式:split ( item, subscr, SUBSEP)
.
例如:split (item, array2, SUBSEP);
后, array2[1]为下标“2”, array2[2]为下标“3”
# -Fb表示分隔符 |
grep
参数解析
- 用法: grep [参数] [查找字符串] [文件名]
- 常用参数:
- -n:显示匹配行及行号.
- -c:只输出匹配行的计数.
- -I:不区分大小写(只适用于单字符).
- -i:不区分大小写.
- -r:子目录递归查找.
- -A n:a指after匹配指定行的后n行数据.
- -B n:b 指before 匹配指定行的前N行数据.
- -C n:显示匹配行的前后N行, 助记”center”.
- -w xxx: 全词匹配, 比如 grep -w RUNNING, 参数w保证”RUN”不会被搜出来.
example
- 在指定文件查找字符串:
grep "XYZ" /etc/passwd
- 在指定文件查找多个:
grep -e "XYZ" -e "root" /etc/passwd
- 在指定目录递归查找:
grep -r XYZ /etc/
- 在指定类型的文件查找字符串:
find . -name '*.c' -exec grep -irn "keyword" {} \;
find -name *.c | xargs grep -irwn "keyword"