1、grep
grep [options] regex [file...]
regex 是指一个正则表达式
- -i : 忽略大小写。不会区分大小写字符。也可用–ignore-case 来指定。
- -v : 不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序只会打印不包含匹配项的文本行。也可用–invert-match 来指定。
- -c : 打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行本身。 也可用–count 选项来指定。
- -l : 打印包含匹配项的文件名,而不是文本行本身,也可用–files-with-matches 选项来指定。
- -L : 相似于-l 选项,但是只是打印不包含匹配项的文件名。也可用–files-without-match 来指定。
- -n : 在每个匹配行之前打印出其位于文件中的相应行号。也可用–line-number 选项来指定。
- -h : 应用于多文件搜索,不输出文件名。也可用–no-filename 选项来指定。
- -E : 使用扩展正则表达式
范例:
# 匹配以 bz 或 gz 或 zip 开头的字符串行
grep -Eh '^(bz|gz|zip)' dirlist*.txt
# 匹配以 以bz开头 或包含 gz 或 包含zip 字符串行
grep -Eh '^bz|gz|zip' dirlist*txt
#特定字符
grep 'a' txt
#范围内字符
grep '[a-z]' txt
grep '[A-Za-z0-9]' txt
grep '[^0-9]' txt 取反,除去数字之外的字符
#任意字符
grep '.' passwd
2、awk
awk '条件 {操作}' 文件
awk '$9 == 500 {print $9, $7}' access.log
awk 的内建变量:
- $0 当前记录(这个变量中存放着整个行的内容)
- $1~n 当前记录的第n个字段,字段间由FS分隔
- FS 输入字段分隔符 默认是空格或Tab
- NF 当前记录中的字段个数,就是有多少列
- NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
- FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
- RS 输入的记录分隔符, 默认为换行符
- OFS 输出字段分隔符, 默认也是空格
- ORS 输出的记录分隔符,默认为换行符
- FILENAME 当前输入文件的名字
范例:
# 指定 : 为分隔符
awk -F ":" '{print $1, $3, $6}' xx.txt
# 查看 ett.txt 文件(共 100 行)内第 20 到第 30 行的内容
awk ‘NR>19&&NR<31’ ett.txt
awk ‘{ if (NR>19&&NR<31) print $0}’ ett.txt
#输出第24行并且加行号
awk ‘NR==24 {print NR,$0}’ ett.txt
#以:为分隔符,打印第5列以s开头的一整行
awk -F ":" '$5~/^s/{print $0}' ett.txt
#对csv文件的第2列的倒数300行求和,并将结果保存到csv
awk -F ',' '{L[NR]=$2}END{for(i=NR-299;i<=NR;i++){ sum+=L[i]};{print $0,sum/300}}' test.csv >> min.csv
#返回第一列中类别相同,第三列中最大的行数据
awk '{if($3>a[$1]){a[$1]=$3;b[$1]=$0}}END{for(i in b) print b[i]}' ett.txt
#统计第一列每个类别的占比
awk '{count[$1]++; if($2>400)above400[$1]++} END{ for(i in count){print i, count[i],above400[i]/count[i]} }' xxx.txt
3、 sed
sed [options] 'command' file(s)
参数:
-n | 取消默认输出 |
-r | 使用扩展正则 |
-i | 刷到磁盘 |
-e | 执行多条sed指令 |
-f | 指令放在文件里 |
sed替换标记:
a | 追加 |
i | 插入 |
d | 删除 |
c | 替换指定的行 |
s | 替换每一行匹配的第一个字符 |
g | 替换每一行的全部 |
w | 另存文件 |
e | 执行bash命令 |
q | 不继续往下读取 |
p | 输出 |
范例:
#在test.txt第一行前插入
sed "1 i This is a test file" test.txt
#test.txt最后一行追加
sed "$ a This is the end of file" test.txt
#删除test.txt第二行
sed "2d" test.txt
#删除test.txt符合正则表达式/fish的行
sed "/fish/d" test.txt
#将text.txt中love替换为like
sed "s/love/like/g" test.txt (/g表示全局匹配)
#输出test.txt的第5-7行
sed -n "5,7p" test.txt (-n的作用就显示出来了,可以去除-n查看效果)