grep
- 文本搜索
- grep [options] 'pattern' [files]
- options:
- -i:忽略大小写
- -c:统计符合条件的行数
- -n:输出行数 + 符合条件的数据
- -r:递归目录查询,输出符合条件的文件名及内容
- -E:pattern里面是正则,要学正则表达式
- -l:输出符合条件的文件名
- -w:匹配整个单词
- -F:按字符串字面意思匹配
- pattern:
- '匹配内容',可以是正则表达式
- 'echo': 包含echo的行
- 'pattern1|pattern2' 满足条件1或条件2
- grep 'pattern1' file | grep 'pattern2' 满足条件1且条件2
sed
- 流编辑器,逐行处理文件
- 主要针对行处理, 增删改查
- sed [options] 'pattern command' [files]
- options
- -n:只打印模式匹配的行(不加则打印文件所有行)
- -r:拓展正则
- -i:直接修改文件,不加-i是不会修改文件中的数据的
- -f:将"pattern command"内容写入文件中,用-f file调用文件中的命令
- pattern,可以没有
- '3':处理第3行
- '3,7':处理第3行到第7行
- '/pattern1/':处理满足pattern1的行
- '/pattern1/,/pattern2/':处理满足pattern1的行到满足pattern2的行,最小匹配,有多个段落符合条件则输出多个
- command,一定要有
- 对符合条件的行进行处理, 打印、增加、删除、修改
- 打印
- 增加:
- a: 在行后新增,另起一行
- 示例: '3 a "python"',第3行后新增内容python
- i: 在行前新增,另起一行
- r: 从外部文件读入待新增内容,行后新增,另起一行
- 示例: '3 r test.txt',第3行后新增test.txt中的内容
- w: 匹配行写入外部文件
- 删除:
- 修改:
- s
- '25 s/old/new/':只修改第25行中第一个old值
- '25 s/old/new/g': 修改25行中所有的old值
- '25 s/old/new/ig': old值忽略大小写
awk
- 文本分析处理工具,及其强大
- 主要针对列处理,用于统计
- awk 'BEGIN{}pattern{commands}END{}' file
- pattern,可以没有
- '/pattern1/':处理满足pattern1的行
- '/pattern1/,/pattern2/':处理满足pattern1的行到满足pattern2的行,最小匹配,有多个段落符合条件则输出多个
- 不支持行号
- 可以是表达式 $6=="test" 第六列等于test 或 $6 ~ "test" 第六列包含test
- command
- 内置变量
- $0: 整行内容
- $n: 第n列内容
- NF: number field, 列数,可以用$NF来引用
- NR: number row, 行数
- FS: field separator, 列分隔符,默认空格或TAB
- RS: row separator,行分隔符,默认回车符
- OFS: output field separator, 输出列分隔符,默认空格
- ORS: output row separator, 输出行分隔符,默认回车
- printf格式
- %s: 字符串
- %d: 整数
- %f: 浮点数,默认6位小数
- +: 右对齐
- -: 左对齐
- %15s: 15位字符,不足用空填充,右对齐;%-15s: 左对齐
- %.2f: 两位小数
- %10.2f: 两位小数,占位10,右对齐
- 完整示例:
- awk 'BEGIN{FS=":"} $1 ~ "^B1" {count++; printf "%-20s\t%-20s\n", \(1,\)(NF-7)}END{printf "%-20s\t%-20s\n", "Total", count}' test.txt
- 以:为列分隔符且第1列以B1开头的行, 获取其第1列和倒数第8列数据(输出格式:列左对齐,列分隔符TAB,行分隔符回车),并再最后加上一行统计数据。
- 太长,写在脚本test_info.awk里,然后用awk -f test_info.awk test.txt执行
# BEGIN和END后的{ 不能放另一行
# {}内每一条语句写一行,语句后;可以省略
BEGIN{
FS=":"
}
{
if ($1 ~ "^B1"){ # pattern写在这里,可以是if,for等等
count++
printf "%-20s\t%-20s\n", $1,$(NF-7)
}
}
END{
printf "%-20s\t%-20s\n", "Total", count
}
BEGIN{
FS="\t"
printf "%-20s%-20s\n", "账号", "店铺数"
}
{
ACOUNTS[$5] += 1
}
END{
for ( ac in ACOUNTS )
{
printf "%-20s%-20d\n", ac, ACOUNTS[ac]
}
}