shell文本三剑客

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,一定要有
    • 对符合条件的行进行处理, 打印、增加、删除、修改
    • 打印
      • p
      • '3,7 p', 查询第3行到第7行
    • 增加:
      • a: 在行后新增,另起一行
      • 示例: '3 a "python"',第3行后新增内容python
      • i: 在行前新增,另起一行
      • r: 从外部文件读入待新增内容,行后新增,另起一行
      • 示例: '3 r test.txt',第3行后新增test.txt中的内容
      • w: 匹配行写入外部文件
    • 删除:
      • d
      • '25 d': 删除第25行
    • 修改:
      • 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]
	}
}
posted @ 2022-10-25 17:00  daxiacet  阅读(37)  评论(0编辑  收藏  举报