大数据之Shell编程(三) 高级文本处理文本(cut-sort-uniq-wc)
1.命令cut(对文本进行切割)
- 基本用法:
用法:cut [选项]... [文件]...
从每个文件中输出指定部分到标准输出。
长选项必须使用的参数对于短选项时也是必需使用的。
-b, --bytes=列表 只选中指定的这些字节
-c, --characters=列表 只选中指定的这些字符
-d, --delimiter=分界符 使用指定分界符代替制表符作为区域分界
-f, --fields=LIST select only these fields; also print any line
that contains no delimiter character, unless
the -s option is specified
-n with -b: don't split multibyte characters
--complement 补全选中的字节、字符或域
-s, --only-delimited 不打印没有包含分界符的行
--output-delimiter=字符串 使用指定的字符串作为输出分界符,默认采用输入
的分界符
--help 显示此帮助信息并退出
--version 显示版本信息并退出
仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔
开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。
每种参数格式表示范围如下:
N 从第1 个开始数的第N 个字节、字符或域
N- 从第N 个开始到所在行结束的所有字符、字节或域
N-M 从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
-M 从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
当没有文件参数,或者文件不存在时,从标准输入读取
- 例如:
>>> wc functest.sh -c # 获取多少个字符
>>> 187 functest.sh
# 比如如果我们现在想要获取187,而不要脚本名称,那么就可以对上面的输出进行切割
>>> wc functest.sh -c | cut -d ' ' -f 1 # 使用' '进行分割,获取第一个参数
>>> 187
# 将PATH变量取出, 我要找出第5个变量
>>> echo $PATH | cut -d ':' -f 5
# 将PATH变量取出, 我要找出第3和5个变量
>>> echo $PATH | cut -d ':' -f 3,5
# 将PATH变量取出, 我要找出第3到最后一个
>>> echo $PATH | cut -d ':' -f 3-
# 将PATH变量取出, 我要找出第3到第5个
>>> echo $PATH | cut -d ':' -f 3-5
# 只显示/etc/passwd的用户和shell
>>> cat /etc/passwd | cut -d ':' -f 1,7
2.命令sort(对文本按行排序)
- 基本用法:
用法:sort [选项]... [文件]...
或:sort [选项]... --files0-from=F
串联排序所有指定文件并将结果写到标准输出。
长选项必须使用的参数对于短选项时也是必需使用的。
排序选项:
-b, --ignore-leading-blanks 忽略前导的空白区域
-d, --dictionary-order 只考虑空白区域和字母字符
-f, --ignore-case 忽略字母大小写
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 只排序可打印字符
-M, --month-sort 比较 (未知) < "一月" < ... < "十二月"
在LC_ALL=C 时为(unknown) < `JAN' < ... < `DEC'
-h, --human-numeric-sort 使用易读性数字(例如: 2K 1G)
-n, --numeric-sort 根据字符串数值比较
-R, --random-sort 根据随机hash 排序
--random-source=文件 从指定文件中获得随机字节
-r, --reverse 逆序输出排序结果
--sort=WORD 按照WORD 指定的格式排序:
一般数字-g,高可读性-h,月份-M,数字-n,
随机-R,版本-V
-V, --version-sort 在文本内进行自然版本排序
其他选项:
--batch-size=NMERGE 一次最多合并NMERGE 个输入;如果输入更多
则使用临时文件
-c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操作
-C, --check=quiet, --check=silent 类似-c,但不报告第一个无序行
--compress-program=程序 使用指定程序压缩临时文件;使用该程序
的-d 参数解压缩文件
--files0-from=文件 从指定文件读取以NUL 终止的名称,如果该文件被
指定为"-"则从标准输入读文件名
-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)
-m, --merge 合并已排序的文件,不再进行排序
-o, --output=文件 将结果写入到文件而非标准输出
-s, --stable 禁用last-resort 比较以稳定比较算法
-S, --buffer-size=大小 指定主内存缓存大小
-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
-T, --temporary-directory=目录 使用指定目录而非$TMPDIR 或/tmp 作为
临时目录,可用多个选项指定多个目录
-u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果
-z, --zero-terminated 以0 字节而非新行作为行尾标志
--help 显示此帮助信息并退出
--version 显示版本信息并退出
POS 是F[.C][OPTS],F 代表域编号,C 是域中字母的位置,F 和C 均从1开始计数
如果没有有效的-t 或-b 选项存在,则从前导空格后开始计数字符。OPTS 是一个或多个
由单个字母表示的顺序选项,以此覆盖此key 的全局顺序设置。如果没有指定key 则
将其整个行。
指定的大小可以使用以下单位之一:
内存使用率% 1%,b 1、K 1024 (默认),M、G、T、P、E、Z、Y 等依此类推。
如果不指定文件,或者文件为"-",则从标准输入读取数据。
- 例如:
# 对/etc/passwd 的账号进行排序
>>> cat /etc/passwd | sort
# 对/etc/passwd 按照第三列进行排序(默认安装字母顺序排序)
>>> cat /etc/passwd | sort -t ':' -k 3
# 对/etc/passwd 按照第三列进行排序(按照数字排序)
>>> cat /etc/passwd | sort -t ':' -k 3n # 升序
>>> cat /etc/passwd | sort -t ':' -k 3nr # 倒序
# 对/etc/passwd 先按照第六个域的第2个字符到第4个字符排序,再按照第一个域倒序
>>> cat /etc/passwd | sort -t ':' -k 6.2,6.4 -k 1r
# 对/etc/passwd 按照第3个域排序后去重
>>> cat /etc/passwd | sort -t ':' -k 3 -u
3.命令uniq(对排序后的文本按行去重)
注意:它只能去重那些相邻行一样的文本,所以一般和sort联合使用
- 基本用法:
用法:uniq [选项]... [文件]
从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。
不附加任何选项时匹配行将在首次出现处被合并。
长选项必须使用的参数对于短选项时也是必需使用的。
-c, --count 在每行前加上表示相应行目出现次数的前缀编号(计数)
-d, --repeated 只输出重复的行
-D, --all-repeated[=delimit-method 显示所有重复的行
delimit-method={none(default),prepend,separate}
以空行为界限
-f, --skip-fields=N 比较时跳过前N 列
-i, --ignore-case 在比较的时候不区分大小写
-s, --skip-chars=N 比较时跳过前N 个字符
-u, --unique 只显示唯一的行
-z, --zero-terminated 使用'\0'作为行结束符,而不是新换行
-w, --check-chars=N 对每行第N 个字符以后的内容不作对照
--help 显示此帮助信息并退出
--version 显示版本信息并退出
若域中为先空字符(通常包括空格以及制表符),然后非空字符,域中字符前的空字符将被跳过。
提示:uniq 不会检查重复的行,除非它们是相邻的行。
如果您想先对输入排序,使用没有uniq 的"sort -u"。
同时,比较服从"LC_COLLATE" 变量所指定的规则。
- 例如:
>>> cat word.txt | sort | uniq
4. 命令wc(对文本进行统计)
- 基本用法:
用法:wc [选项]... [文件]...
或:wc [选项]... --files0-from=F
输出每个指定文件的行数、单词计数和字节数,如果指定了
多于一个文件,继续给出所有相关数据的总计。如果没有指定
文件,或者文件为"-",则从标准输入读取数据。
-c, --bytes 输出字节数统计
-m, --chars 输出字符数统计
-l, --lines 输出行数统计
--files0-from=文件 从指定文件读取以NUL 终止的名称,如果该文件被
指定为"-"则从标准输入读文件名
-L, --max-line-length 显示最长行的长度
-w, --words 显示单词计数
--help 显示此帮助信息并退出
--version 显示版本信息并退出