linux文本处理工具

1. grep 'regex' file(s)

是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep 'root' /etc/passwd
grep '[0-9]' /etc/passwd
grep "match_pattern" file_1 file_2 file_3 ... #在多文件中查找
grep -E '[1-9]+' #使用正则表达式 -E 选项 或者 egrep '[1-9]+'

2. sed [options] 'command' file(s)

sed是一种流编辑器,它是文本处理中常用的工具,能够完美的配合正则表达式使用。

#options: -e, -n
#command: 行定位(正则) + sed命令(操作)
sed -n 'p' /etc/passwd #打印文件中所有行
sed -n '10p' /etc/passwd #打印出文件第十行的内容
sed -n '/root/p' /etc/passwd #打印出含有root关键字的行(/patten/表示正则)
sed -n '10,20p' /etc/passwd #打印出文件第十行到第二十行的内容
sed -n '10!p' /etc/passwd #取反,除第十行以外的其他行内容被打印出来
sed -n '10,20!p' /etc/passwd #取反,除第十行到第二十行范围以外的其他行内容被打印出来
sed -n '1~2p' /etc/passwd #~2表示步长为2,起始行为1.
#-a新增行/i插入行
#-c替代行
#-d删除行
sed '1a =========' /home/wordcounttest.txt#在第一行后面添加一行内容sed '1,3a =========' /home/wordcounttest.txt#在第一行到第三行后面全都添加一行相同的内容
sed '1i =========' /home/wordcounttest.txt#在第一行前面添加一行内容
sed '1c sdadfavvfa' /home/wordcounttest.txt #替换第一行的内容
sed '1,3c sdadfavvfa' /home/wordcounttest.txt #把第一行到第三行的所有的内容替换为sdadfavvfa这一行的内容
sed '1d' /home/wordcounttest.txt #删除第一行的内容
sed '$a haha \nhehe' /home/wordcounttest.txt #添加两行内容到文件末尾
sed '/^$/d' /home/wordcounttest.txt #删除空行
sed -n '/Error/p' /home/wordcounttest.txt #打印出含有Error的行
sed 's/hello/hadoop/' /home/wordcounttest.txt #把hello替换为hadoop(s表示替换但是只是替换含有关键字的行的第一次出现的字符串,加g表示全局)
sed 's/hello/hadoop/g' /home/wordcounttest.txt 
sed '{3d;s/hello/hadoop/}' /home/wordcounttest.txt #同时执行多个命令(删除第三行后替换剩下行中含有hello字符串为hadoop)
sed -n '{n;p}' /home/wordcounttest.txt
sed '1r 123.txt' abc.txt #把123.txt文件中的内容插入到abc.txt文件第一行的后面
sed '1w 123.txt' abc.txt 把abc.txt文件中的第一行内容写入到123.txt文件中(123.txt文件中原有的内容会被删除)

2. awk [options] 'command' file(s)

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。

#command: pattern{awk操作命令}
#pattern:正则表达式;逻辑判断式
#awk内置变量:$0 表示整个当前行;$1表示每行第一个字段,以此类推。
#NR表示每行的记录号(行号);NF表示字段数量变量(列号);FILENAME表示正在处理的文件名
#options:-F 后面跟分隔符,默认是空格;例:-F ':' 冒号分割
awk -F ':' '{print $1}' /etc/passwd #冒号分割打印出第一个字段。
awk -F ':' '{print $1"\t"$3}' /etc/passwd#冒号分割打印出第一个字段和第三个字段并且用\t分隔开两个字段显示。
awk -F ':' '{print NR,NF}' /etc/passwd #打印出每行的行号和每行用冒号分割后一共有多少列
awk -F ':' '{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}' /etc/passwd#使用printf()函数
awk -F ':' '{if ($3 > 100) print $1}' /etc/passwd #使用判断语句
awk '/hello/{print $2}' /home/wordcounttest.txt #找出含有hello的行并且打印出用空格分割后的第二个字段
awk -F ':' '$1~/root/{print $1}' /etc/passwd #如果第一个字段匹配到正则(/root/)就打印出来
# ~表示匹配;!~表示取反;>;<;==;!=
awk -F ':' '$3>100{print $3}' /etc/passwd#第三个字段如果大于100就打印出来
#扩展格式:BEGIN{print "start"} pattern{commands} END{print "end"}
awk -F ':' 'BEGIN{print "line col user"}{print NR,NF,$1}END{print "---"FILENAME"---"}' /etc/passwd #用表格的形式打印出来
ls -l | awk 'BEGIN{size=0}{size+=$5}END{print size}' #求和,size初始化为0
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' /etc/passwd #计数
awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for (i=0;i

你可能感兴趣的:(linux文本处理工具)