mac 文本处理命令分享
mac 文本处理命令分享
Table of Contents
1 sed
默认sed命令只是对标准输出做变更,不会影响到源文件,但是如果加了-i之后,会变更源文件。mac中的-i参数使用和linux有差异。后面只对mac的命令做说明。 -i '' i后加上备份文件名称才能影响到源文件。''默认是和原文件名相同,不产生备份文件。 本测试的文件为csophys。其中的内容如下: cat csophys I am the first line! line second is me.
1.1 文本查找替换
sed -i '' 's/line/LINE/' csophys
1.2 文本插入
a在目标行之后插入,i在目标行之前插入。
sed '1 a\ insert ' csophys sed '1 i\ insert ' csophys sed '$line a\ xxxx ' file
$line这是目标行,也可以用正则来定位所有匹配的行。
sed '/line/ i\ insert ' csophys
也可以直接在匹配行之后插入其他文件的内容,比如:
sed '/first/r command.org' csophys
1.3 文本行删除
删除文本中的行
sed '/se.*/d' csophys
1.4 执行sed脚本
cat sed.rule s/first/FIRST/ s/second/SECOND/
sed -f sed.rule csophys I am the FIRST line! line SECOND is me.
更多命令可以参考 man sed。
2 awk
awk '{pattern + action}' {filenames}
awk是在每行处理文本的时候,默认按照空格隔离每一个域,对每一个域做处理。也可以直接通过在awk 后加 -F. 指定分隔符。
ls -l | awk '/rw/{print "第三列:"$3"\t|\t""第5列:"$5}'
第三列:csophys | 第5列:3154
第三列:csophys | 第5列:42
第三列:csophys | 第5列:5253
第三列:csophys | 第5列:32
第三列:csophys | 第5列:35
ls -l | awk 'BEGIN{OFS="&";count=10;for(i=0;i<3;i++)print"开始"}/rw/{print ++count,NR,$3,$5}END{print "结束"}' 开始 开始 开始 11&2&csophys&23 12&3&csophys&3675 13&4&csophys&42 14&5&csophys&5253 15&6&csophys&32 16&7&csophys&35 结束
awk中可以使用printf来格式化输出,也可以使用if判断语句
ls -l | awk 'BEGIN{OFS="&";count=10;for(i=0;i<3;i++)print"开始"}/rw/{if(NR>3) printf("printf:%s,%s,%s,%s\n",++count,NR,$3,$5)}END{print "结束"}' <i++)print"开始"}/rw/{if(NR>3) printf("printf:%s,%s,%s,%s\n",++count,NR,$3,$5)}END{print "结束"}' 开始 开始 开始 printf:11,4,csophys,42 printf:12,5,csophys,5253 printf:13,6,csophys,32 printf:14,7,csophys,35 结束
awk 内部变量名的含义如下:
变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符,默认为一个空格 RS 输入记录分隔符 NF 当前记录里域个数 NR 到目前为止记录数 OFS 输出域分隔符 ORS 输出记录分隔符
更加强大的功能参考 man awk。 或者参考博客:
3 sort
sort [-ntkr] 文件名 #-n 采用数字排序 #-t 指定分隔符 #-k 指定第几列 #-r 反向排序
ls -l | awk '/rw/{print $5}' | sort -n -r 5253 1608 42 35 32
ls -l | sort -k 5 -n -r -rw-r--r-- 1 csophys staff 5253 9 3 11:25 passwd -rw-r--r-- 1 csophys staff 1817 9 3 22:29 command.org -rw-r--r-- 1 csophys staff 42 9 1 23:14 csophys -rw-r--r-- 1 csophys staff 35 9 3 11:37 test -rw-r--r-- 1 csophys staff 32 9 2 22:59 sed.rule total 48
ls -l | sort -k 2 -t ":" total 48 -rw-r--r-- 1 csophys staff 42 9 1 23:14 csophys -rw-r--r-- 1 csophys staff 5253 9 3 11:25 passwd -rw-r--r-- 1 csophys staff 2157 9 3 22:31 command.org -rw-r--r-- 1 csophys staff 35 9 3 11:37 test -rw-r--r-- 1 csophys staff 32 9 2 22:59 sed.rule
4 uniq
uniq一般需要和sort配合使用。uniq 的作业是删除连续相同的行,所以在sort之后使用效果很好。-c 参数可以打印出重复的次数。
ls -l | awk '/rw/{print $3}' csophys csophys csophys csophys csophys ls -l | awk '/rw/{print $3}' | uniq -c 5 csophys
5 其他
- cut。cut可以截取指定分隔符隔开后的具体某一列或者某几列。
- tr。tr命令主要作用是在于文本转换或者删除
- paste。paste作用是在于按照指定的分隔符按照行进行合并
- split。使用split可以实现文件的分割,支持按照行数分割和按照大小分割两种模式。
Created: 2017-09-04 Mon 23:16