文本处理三剑客——sed、awk、grep
天然支持管道符和正则表达式
正则表达式 正则表达式,又称规则表达式:Regular Expression,在代码中常简写为regex、regexp或RE。
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
1、常用的元字符
代码
说明
.
匹配除换行符以外的任意字符
\w
匹配字母或数字或下划线或汉字
\s
匹配任意的空白符
\d
匹配数字
\b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束
其他:
[:alnum:] 或 [0-9a-zA-Z]
[:alpha:] 或 [a-zA-Z]
[:upper:] 或 [A-Z]
[:lower:] 或 [a-z]
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字 或[0-9]
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
2、常用的限定符
代码/语法
说明
*
重复零次或更多次
.*
任意字符的一次或多次
\+
重复一次或更多次
\?
重复零次或一次
\{n\}
重复n次
\{n,\}
重复n次或更多次
\{n,m\}
重复n到m次
注意:***** 默认是量词而不是元字符,所以一般不需要加转义符号
3、常用的反义代码
代码/语法
说明
\W
匹配任意不是字母,数字,下划线,汉字的字符
\S
匹配任意不是空白符的字符
\D
匹配任意非数字的字符
\B
匹配不是单词开头或结束的位置
[^aeiou]
匹配除了aeiou这几个字母以外的任意字符
4、分组和后向引用
分组:
\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
后向引用:
引用前面的分组括号中的模式所匹配字符,而非模式本身
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
\2 表示从左侧起第2个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推
& 表示前面的分组中所有字符
流程分析如下:
示例:
4、锚定
分类
代码/语法
说明
单词模式
\<或者\b
词首锚定,用于单词模式的左侧
\>或者\b
词尾锚定,用于单词模式的右侧
捕获
(exp)
匹配exp,并捕获文本到自动命名的组里
(?<name>exp)
匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
(?:exp)
匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp)
匹配exp前面的位置
(?<=exp)
匹配exp后面的位置
(?!exp)
匹配后面跟的不是exp的位置
(?<!exp)
匹配前面不是exp的位置
注释
(?#comment)
这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
零宽断言 是一种特殊的正则匹配,本身表达式不匹配任何字符(零个字符,所以称为零宽),而是满足某种条件(称为断言)。断言用来声明一个应该为真的事实。前面的 ^ , $ , \b 等等就属于零宽断言的范畴。
5、懒惰限定符
代码/语法
说明
*?
重复任意次,但尽可能少重复
+?
重复1次或更多次,但尽可能少重复
??
重复0次或1次,但尽可能少重复
{n,m}?
重复n到m次,但尽可能少重复
{n,}?
重复n次以上,但尽可能少重复
6、其他
代码/语法
说明
\t
制表符,Tab
\r
回车
\n
换行符
\f
换页符
\e
Escape
\b
通常是单词分界位置,但如果在字符类里使用代表退格
\v
竖向制表符
\A
字符串开头(类似^,但不受处理多行选项的影响)
\Z
字符串结尾或行尾(不受处理多行选项的影响)
\z
字符串结尾(类似$,但不受处理多行选项的影响)
\G
当前搜索的开头
在线正则表达式测验:https://tool.oschina.net/regex/
grep grep全称是Global Regular Expression Print,表示全局正则表达式版本。Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式 搜索文本,并把匹配的行打印出来(匹配到的标红)。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
egrep = grep -E:扩展的正则表达式 (除了< , > , \b 使用其他正则都可以去掉)
基本用法:
1 grep [-options] '过滤规则' [文件] # 过滤规则本质上是正则表达式
grep
擅长过滤
选项
选项
作用
-A<显示行数>
除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-B<显示行数>
除了显示符合样式的那一行之外,并显示该行之前的内容。
-C<显示行数>
除了显示符合样式的那一行之外,并显示该行之前后的内容。
-e
实现多个选项间的逻辑or 关系
-E
扩展的正则表达式
-v
显示不被pattern 匹配到的行,相当于[^] 反向匹配
-c
统计匹配的行数
-f 文件名
从文本文件内容中获取PATTERN匹配
-i
忽略字符大小写的差别。
-n
显示匹配的行号
-o
仅显示匹配到的字符串
-q
静默模式,不输出任何信息
-s
不显示错误信息
-w
匹配 整个单词
演示
sed sed意为流编辑器(Stream Editor),它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间 ”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间 。这样不断重复,直到文件末尾。文件内容并没有改变 ,除非使用重定向存储输出或-i 。
(保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理)
原理:
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
输出:**sed
会将文本内容逐行读取到内存中,没有匹配到行的直接输出到屏幕上;匹配到的行利用规则处理之后输出到屏幕上。**
基本用法:
1 sed [-options] 'script' [文件]
选项
选项
作用
-n
不打印模式空间中的内容
-e
多点编辑,对每行处理时,可以有多个Script
-i
直接将处理的结果写入文件
-i.bak
在将处理的结果写入文件之前备份一份原文件
-f file
把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
-r
支持扩展的正则表达式
地址定界 没有地址则是对全文进行处理
形式
含义
空地址
默认处理全文所有行
m
指定第m行
$
最后一行
m,n
从第m行到第n行
m,+n
从第m行到第m+n行
m,/pattern/
从第m行到第一次 模式匹配到的行
/partner/
此模式能匹配的每一行
/partner1/,/partner2/
第一次被模式1匹配的行到第一次被模式2匹配到的行
1~2
奇数行,从第一行开始,一次加两行
2~2
偶数行,从第二行开始,一次加两行
命令
d:删除 模式空间匹配的行,delete
p:打印 当前模式空间匹配的行,print
a \test :在指定行 后面追加 文本,支持使用\n实现多行追加,append
i \test :在行前面插入 文本,支持使用\n实现多行追加,insert
c \test :替换 行为单行或多行文本,支持使用\n实现多行追加,change
w file:保存模式匹配的行另存到指定文件
r file:读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行 取反 处理,格式为地址定界!编辑命令 ,如’5!d’表第5行不删
s/partner/str/[修饰符]: 查找替换 ,支持使用其它分隔符,如:s@@@,s###;
加g表示行内全局替换; 而不是只替换每行的第一个
加i表示不区分大小写
加p显示替换成功的行
在替换时,可以加一下命令,实现大小写转换
\l:把下个字符转换成小写。
\L:把replacement字母转换成小写,直到\U或\E出现。
\u:把下个字符转换成大写。
\U:把replacement字母转换成大写,直到\L或\E出现。
\E:停止以\L或\U开始的大小写转换
后向引用:\(**\)
,\1,\2...
对应括号内容,**&表示引用匹配到整个**
高级命令
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖 至模式空间
N:读取匹配到的行的下一行追加 至模式空间
d:删除模式空间中的所有行
D:它用于删除模式空间中匹配到的第一行,并在删除后对剩余的文本重新执行 sed 脚本,以进行进一步的处理。
演示
选项演示
地址定界演示
命令演示
高级选项演示
awk awk,全称GNU awk,此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan,awk 就取自这 3 为大师姓的首字母。
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数 和动态正则表达式 等先进功能,是linux/unix下的一个强大编程工具。awk有很多内建的功能 ,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。它在命令行中使用,但更多是作为脚本来使用。本文只介绍它的命令行用法,对于大多数场合,应该足够用了。
awk语法 在脚本之中,awk的语法大致可以分为三种:
1 2 3 4 awk [options] 'scripts' var=value file awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
awk选项
-F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value:赋值一个用户定义变量,将外部变量传递给awk
-f scripfile:从脚本文件中读取awk命令
awk变量 awk的变量分为内置变量和自定义变量。每个变量前加 -v 选项。
内置变量
变量名
含义
FS
Field Separator ,输入字段分隔符, 默认是空格或Tab。
OFS
Out Field Separator ,输出字段分隔符, 默认也是空格
$0
当前行的所有内容
$1~$n
当前行的第n个字段,字段间由 FS变量 分隔
NF
Number of Fields ,当前行中的字段个数,就是有多少列
RS
Record Separator ,输入的行分隔符, 默认为换行符
ORS
Out Record Separator ,输出的行分隔符,默认为换行符
NR
Number of Record ,已经读出的行数,就是行号,从1开始,如果有多个文件的话,这个值也是不断累加中。
FNR
File Number of Record ,文件记录数,与NR不同的是,这个值会是各个文件自己的行号,有多个文件的话,各自从1开始。
FILENAME
当前输入文件的名字
ARGC
命令行参数 的个数
ARGV
数组,保存的是命令行所给定的各参数,查看参数
自定义变量 自定义变量( 区分字符大小写),格式:
awk变量演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 [root@along ~]# cat awkdemo hello:world linux:redhat:lalala:hahaha along:love:youou [root@along ~]# awk -v FS=':' '{print $1,$2}' awkdemo hello world linux redhat along love [root@along ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo hello---world linux---redhat along---love [root@along ~]# awk -v RS=':' '{print $1,$2}' awkdemo hello world linux redhat lalala hahaha along love you [root@along ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo hello world---linux redhat---along love--- [root@along ~]# awk -F: '{print NF}' awkdemo 2 4 3 [root@along ~]# awk -F: '{print $(NF-1)}' awkdemo hello lalala love [root@along ~]# awk '{print NR}' awkdemo awkdemo1 1 2 3 4 5 [root@along ~]# awk END'{print NR}' awkdemo awkdemo1 5 [root@along ~]# awk '{print FNR}' awkdemo awkdemo1 1 2 3 1 2 [root@along ~]# awk '{print FILENAME}' awkdemo awkdemo awkdemo awkdemo [root@along ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo1 3 [root@along ~]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1 awk [root@along ~]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1 awkdemo [root@along ~]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1 awkdemo1 [root@along ~]# awk -v name="along" -F: '{print name":"$0}' awkdemo along:hello:world along:linux:redhat:lalala:hahaha along:along:love:you [root@along ~]# awk -F: '{print name":"$0;name="along"}' awkdemo :hello:world along:linux:redhat:lalala:hahaha along:along:love:you [root@along ~]# cat awk.txt {name="along" ;print name,$1 } [root@along ~]# awk -F: -f awk.txt awkdemo along hello along linux along along
printf命令 格式化输出命令。
printf命令可以比print命令输出更多形式的内容
格式:
1 printf "FORMAT" , item1,item2, ...
① 必须指定FORMAT
② 不会自动换行,需要显式给出换行控制符,\n
③ FORMAT 中需要分别为后面每个item 指定格式符
格式符:与item 一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E: 显示科学计数法数值
%f :显示为浮点数,小数 %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上
%g, %G :以科学计数法或浮点形式显示数值
%s :显示字符串 ;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示
%u :无符号整数
%%: 显示% 自身
修饰符:放在%与格式符之间
#.# :第一个数字控制显示的宽度;第二个# 表示小数点后精度,%5.1f
- :左对齐(默认右对齐 ) %-15s
+ :显示数值的正负符号 %+d
printf命令演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@along ~]# awk -F: '{print $1,$3}' /etc/passwd root 0 bin 1 ---第一列显示小于20的字符串;第2列显示整数并换行 [root@along ~]# awk -F: '{printf "%20s---%u\n",$1,$3}' /etc/passwd root---0 bin---1 ---使用-进行左对齐;第2列显示浮点数 [root@along ~]# awk -F: '{printf "%-20s---%-10.3f\n",$1,$3}' /etc/passwd root ---0.000 bin ---1.000 ---使用printf 做表格 [root@along ~]# awk -F: 'BEGIN{printf "username userid\n-----------------------------\n"}{printf "%-20s|%-10.3f\n",$1,$3}' /etc/passwd username userid ----------------------------- root |0.000 bin |1.000
awk操作符
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, –
比较操作符:
模式匹配符:~
操作符~是用于执行模式匹配的操作符。它用于检查一个字符串是否与指定的模式匹配。
语法格式如下:
其中,string表示要进行匹配的字符串,pattern表示要匹配的模式。pattern即匹配模式,在下一部分详细介绍
操作符~返回一个布尔值,如果字符串string符合模式pattern,则返回真(true),否则返回假(false)。
例如,以下是一个使用~操作符进行匹配的示例 awk程序:
1 awk '$0 ~ /apple/ { print "Found apple!" }' Copy
上述awk程序将遍历输入的每一行,如果某一行包含字符串”apple”,则输出”Found apple!”。
请注意,~操作符是区分大小写的,如果要进行不区分大小写的模式匹配,可以使用操作符~~(两个波浪线)来执行不区分大小写的匹配。
逻辑操作符
与&& ,或|| ,非!
函数调用
function_name(argu1, argu2, …)
条件表达式(三目表达式)
1 2 selector?if-true-expression:if-false-expression
awk操作符演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [root@along ~]# df -h |awk -F: '$0 ~ /^\/dev/' /dev/mapper/cl-root 17G 7.3G 9.7G 43% / /dev/sda1 1014M 121M 894M 12% /boot [root@along ~]# df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}' 43%---/dev/mapper/cl-root 12%---/dev/sda1 [root@along ~]# df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}' |awk -F% '$1 > 40' 43%---/dev/mapper/cl-root [root@along ~]# awk -F: '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd root 0 bin 1 [root@along ~]# awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd root [root@along ~]# awk -F: '!($3==0) {print $1}' /etc/passwd bin [root@along ~]# awk -F: '!($0 ~ /bash$/) {print $1,$3}' /etc/passwd bin 1 daemon 2 [root@along ~]# awk -F: '{$3 >= 1000?usertype="common user":usertype="sysadmin user";print usertype,$1,$3}' /etc/passwd sysadmin user root 0 common user along 1000
awk匹配模式 PATTERN:根据pattern 条件,过滤匹配的行,再做处理
未指定
空模式,匹配每一行
/regular expression/
正则表达式 ,仅处理能够模式匹配到的行,需要用/ / 括起来
relational expression
关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
line ranges
行范围
startline(起始行),endline(结束行):/pat1/,/pat2/ 不支持直接给出数字,可以有多段,中间可以有间隔
BEGIN/END 模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{} :仅在文本处理完成之后执行
匹配模式演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@along ~]# awk -F: '{print $1}' awkdemo hello linux along [root@along ~]# awk -F: '/along/{print $1}' awkdemo along [root@along ~]# awk -F: '1{print $1}' awkdemo hello linux along [root@along ~]# awk -F: '0{print $1}' awkdemo [root@along ~]# awk -F: '/^h/,/^a/{print $1}' awkdemo hello linux along [root@along ~]# awk -F: 'BEGIN{print "第一列"}{print $1} END{print "结束"}' awkdemo 第一列 hello linux along 结束
grep awk sed对比 grep 主要用于搜索某些字符串;sed,awk 用于处理文本 ;
grep基本是以行为单位处理文本的,grep可以理解为主要作用是根据正则表达式过滤内容 。
sed是一个非交互性文本流编辑器,每次读入一行来处理的,sed 适合简单的文本替换和搜索
awk是一个文本处理工具,以字段为单位,把一个有规律的文件处理成想要的格式。
awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作 ,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。实际上,awk的确拥有自己的语言:awk程序设计语言,awk的三位创建者已将它正式定义为:样式扫描和处理语言。基于以上理由,再加上awk强大的功能,如果要处理与文本样式扫描相关的工作,awk应该是第一选择。
其他 sort sort 是Linux中的排序工具,它完美贯彻了 Unix 哲学:”只做一件事,并做到完美”。它的排序功能极强、极完整,只要文件中的数据足够规则,它几乎可以排出所有想要的排序结果,是一个非常优质的工具。
虽然 sort 很强大,但它的选项很少,使用方法也很简单。
sort语法 1 sort [-Options]... [File]
sort选项 1 2 3 4 5 6 7 8 9 10 11 12 -b: 忽略字段的前导空白字符。空格数量不固定时,该选项几乎是必须要使用的。"-n"选项隐含该选项。 -n:按数值排序。空字符串""或"\0"被当作空。该选项除了能识别负号"-",其他所有非数字字符都不识别。 -f:忽略字母大小写。其实是将所有小写字母当成大写字母。比如将"b"看作"B"。 -u:去除重复行。结合"-f"使用时,重复的小写行将被丢弃。该选项隐含 "-s" 选项。 -r:将结果倒序。默认是升序排序,使用该选项将得到降序排序的结果。注意,虽然 "r" 选项是降序结果,但它不影响排序过程,只影响最终排序结果。也就是 说,在按照升序排序结束得到最终结果后,再反转第 2 列顺序,也就是得到了降序的结果。同样也说明,sort 在排序的时候,一定且只能按照升序排序,只 有排序动作结束了 "r" 选项才开始工作。 -t:指定字段分隔符。 -k:指定要排序的key,key由字段组成。key格式为"POS1[,POS2]",POS1为key起始位置,POS2为key结束位置。 -o:将结果输出到指定文件中。 -c:检测给定的文件是否已经已经排序。如已排序,状态码为0;未排序,状态码为1,会输出诊断信息,提示从哪一行开始乱序。 -C:类似于"-c",只不过不输出任何诊断信息。可以通过退出状态码1判断出文件未排序。 -s:禁止sort做"最后的排序"。禁止 "最后的排序" 后,对那些排序 key 相同的行,将保留被读取时相对顺序。 -h:按照文件容量大小规则排序。
sort演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 [root@linuxidc tmp]# cat system.txt 1 mac 2000 500 2 winxp 4000 300 3 bsd 1000 600 4 linux 1000 200 5 SUSE 4000 300 6 Debian 600 200 [root@linuxidc tmp]# sort system.txt 1 mac 2000 500 2 winxp 4000 300 3 bsd 1000 600 4 linux 1000 200 5 SUSE 4000 300 6 Debian 600 200 [root@linuxidc tmp]# sort -t $'\t' -k3 system.txt 4 linux 1000 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300 6 Debian 600 200 [root@linuxidc tmp]# sort -t $'\t' -k3 -n system.txt 6 Debian 600 200 3 bsd 1000 600 4 linux 1000 200 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300 [root@linuxidc tmp]# sort -t $'\t' -k3 -k4 -n system.txt 6 Debian 600 200 4 linux 1000 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300 [root@linuxidc tmp]# sort -t $'\t' -k3n -k2r system.txt 6 Debian 600 200 4 linux 1000 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300 sort -t $'\t' -k3n -k2,2r system.txt [root@linuxidc tmp]# sort -t $'\t' -k3n -k2.2,2.2 system.txt 6 Debian 600 200 4 linux 1000 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300 [root@linuxidc tmp]# sort -t $'\t' -k3n -u system.txt 6 Debian 600 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300 [root@linuxidc tmp]# sort -t $'\t' -k3n -o system1.txt system.txt [root@linuxidc tmp]# sort -c -k3n system.txt ;echo $? sort : system.txt:3: disorder: 3 bsd 1000 600 1 [root@linuxidc tmp]# sort -C -k3n system.txt ;echo $? 1
cut cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中。我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来。
cut语法 1 $ cut [-Options]... [File]
cut选项 1 2 3 4 5 6 7 8 9 10 11 -c : 提取指定的字符,可以是以逗号分隔的数字的列表,也可以是以连字符分隔的数字的范围。char -f : 提取指定的字段,cut 命令使用 Tab 作为默认的分隔符。搭配 -d 指定字段分隔符 -b : 提取指定的字节,也可以指定一个范围。搭配 -n 不要分割多字节字符。 –complement : 不输出选中的部分,即反选。 –output-delimiter : 指定输出时使用的分隔符。 --only-delimited : 不输出不包含分隔符的列
cut演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 $ cat content.txt Ubuntu Linux Microsoft Windows OsX El Capitan Unix FreeBSD $ cut -d " " -f 1 content.txt Ubuntu Microsoft OsX Unix FreeBSD $ cut -c 1-7 content.txt Ubuntu Microso OsX El Unix FreeBSD