linux-shell文本处理
记录Linux文本处理命令:grep,cut,sed,awk,paste,tac。
四、文本处理
4.1.用grep在文件中搜索文本
grep "go" main.go
#支持对多个文件进行搜索
grep "go" main.go models/models.go
#使用color给输出行重点标出匹配单词
grep "go" main.go models/models.go --color=auto
#-E扩展正则表达式
echo "this is a line."|grep -o -E "[a-z]+\."
#-v 将匹配结果反转
echo "this is a line."|grep -v "line"
#-c 统计匹配行的数量
echo -e "1234\nhello\n56"|grep -c "[0-9]"
#-n 随结果打印文件名
#-l 打印匹配文本在哪个文件中
#-L 打印匹配文本不在文件列表中
#-r 递归目录
grep -rn "go" ./*
grep -rl "go" ./*
#-i 忽略字符大小写
echo "hello world"|grep -i "HELLO"
#-e 指定多个匹配项
echo -e "1234\nhello\n56"|grep -e "1" -e "5"
# -A 打印某个结果之前n行 -B 打印结果之后n行 -C 打印之前和之后n行
seq 10|grep 5 -A 3
seq 10|grep 5 -B 3
seq 10|grep 5 -C 3
4.2.cut 按列切分文件
#默认使用制表符作为界定符
cut -f 2,3 filename
#使用-d指定新的界定符
cut -f 1,3 -d "|" *.log
#-complement 对提取的字段进行补集运算
cut -f 1,3 -d "|" --complement *.log
# -b 表示字节 -c 表示字符 -f 表示定义字段
cut -c1-5 *.log
#打印前5个字符
cut -c-5 *.log
#-b或者-c 时 需要使用--output-delimiter指定输出界定符
cut *.log -c1-5,6-8 --output-delimiter ":"
4.3.sed文本替换
sed 's/a/b/g' filename
#-i 参数 将替换数据直接写入原文件
sed -i "" 's/a/b/g' filename
# 防止冲突 可以任意使用界定符 界定符出现在内部时 需要通过前缀\进行转义
sed -i "" 's#a#b#g' filename
sed -i "" 's|a|b|g' filename
sed -i "" 's:a:b:g' filename
#移除行 空白行的正则表达式^$ /pattern/d 移除样式相同的行
sed '/^$/d' filename
4.4.awk
$0 代表当前行 $1 代表第一个字段 $2 代表第二个字段
awk -F ':' '{print $1}' /etc/passwd
4.5.按列拼接文件 paste
paste file1.txt file2.txt
4.6.tac逆序打印行
seq 10|tac