输出文本
echo打印文本
echo命令一般有多个版本,默认情况下通常会优先使用shell的内置版本,这里的命令语法是GNU coreutils包中的语法,但通常shell内置的echo命令也支持以下语法。直接执行echo命令将默认使用shell内置的版本,因此如果需要使用GNU coreutils包中的echo命令,需要使用env(env echo…)来调用
echo [选项] [字符串]
- 默认情况下,指定多个字符串时,每个字符串之间会有一个空格,所有字符串输出完毕后会有一个换行符
- -n 不输出最后的换行符
- -e 启用转义字符
echo支持以下转义字符:
字符 | 说明 |
---|---|
\a | 警告铃 |
\b | 退格 |
\c | 终止输出,所有该转义字符之后的字符串将不被输出,类似于ctrl+c |
\e | 表示esc(Escape Character),常用来引导控制终端输出格式 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 输出反斜线 |
\0nnn | 八进制数nnn(0-3位八进制数字) |
\nnn | 八进制数nnn(1-3位八进制数字) |
\xhh | 十六进制数hh(1位或2位十六进制数) |
printf格式化打印文本
printf “格式” 参数(常量或变量)…
printf命令支持的格式字符串和C语言基本一致,有略微不同:
- 命令会根据需要重复使用格式,并赋予所有参数,如:printf %.4d 1 2,参数1和2都会被给予格式%.4d,即便%.4d只指定了一个,输出为:00010002
- 如果指定了格式但没有给参数,命令会根据上下文将参数赋值为null(字符串)或0(数值),如:printf “aa%sbb%dcc”,输出为aabb0cc,对于格式%s填充值为null(不打印任何字符),对于格式%d填充值0
shuf生成随机字符串排列(shuffles)
该命令可以用来随机输出指定的文本,也可以用来生成随机值
shuf [选项] [文件]
- -e 将每个输入的参数都视为一个本文行
- -i 最小值-最大值:随机生成该区间之间的值(无符号整数)
- -n 值:指定输出次数,默认为输入多少个文本,就输出多少次
- -o 文件名:将输出结果写入到文件中,而不打印到屏幕
- -r 生成的随机行可以重复
- -z 行结束符为NUL,而非默认的换行符
seq生成连续数字队列
seq 用来生成一系列连续的数字,它可以指定数字生成的格式、增量,方便用户在脚本和命令行中,不使用循环就生成具有一定规律的数字,常用来搭配其他信息生成一些连续的字符串作为文件名等
seq [选项] [起始值] [增量] 结束值
- 默认情况下,每个数字都将被单独打印一行
- 如果不指定起始值或增量,则默认为1
- 增量的值不能为0,需要重复输出某个值应当使用yes命令
- 起始值、增量、结束值可以为inf,表示一个无穷大的值
- 当当前数字与增量相加,值大于结束值时,命令输出会结束,因此:seq 5 5将输出5,而seq 10 5将不会有任何输出
- -w 将数字格式化为等宽,前补0
- -f “格式字符串”:使用指定的格式输出数字,格式可以参考C语言print语句的输出格式要求
- -s “分隔字符”:指定输出序列中的分隔符(默认为换行符\n)
yes输出连续字符串
yes [字符串]
- 默认情况下,该命令会一直输出字符’y’,后接一个换行符,直到命令被终止
- 如果指定了一个字符串,则会持续输出该字符串
文本处理
grep数据查找
grep命令用于在指定内容或文件中查找满足匹配模式的字符的行,其输出是满足匹配模式的字符串行。该命令功能强大,支持Unix风格的正则表达式,是最常用的命令之一。
grep [参数] 匹配模式 [文件] 找到或排除字符串所在行,然后输出内容
- -i 不区分大小写
- -v 排除指定字符串
- -n 显示匹配内容的行号
- -c 显示有多少行满足匹配
- -e 指定多个匹配条件
sort排序处理
默认情况下,sort命令按照会话指定的默认语言的排序规则对文本数据行排序,且数字也会被当作字符处理(如果要按数值排序,使用-n选项)
sort [选项] [文件名]
将文件或命令结果进行排序,默认以每行第一个字母为依据,按字母顺序排序
- -f 忽略大小写
- -n 将数字作为值处理,按数值大小进行排序
- -r 反向排序
- -t 指定分隔符为分段依据
- -M 按月份排序,常用于日志文件排序
- -k n,m 指定字段为排序依据,若不指定m则判断依据为以n字段开始到本行末
以下为可能用到的完整命令选项及其缩写
命令缩写 | 完整命令 | 说明 |
---|---|---|
-b | --ignore-leading-blanks | 排序时忽略起始的空白 |
-c | --check | 检查输入的数据或文件是否已排序,如果未全部排序,则打印第一个未排序的行,并以状态码1退出 |
-C | --check=quiet | 检查输入的数据或文件是否已排序,如果未全部排序,以状态码1退出,但不打印未排序的行内容 |
-d | --dictionary-order | 以通讯录方式排序,只考虑空白字符、字母、数字进行排序,忽略其他所有字符 |
-f | --ignore-case | 默认情况下,大写字母排于小写字母前,这个选项会忽略大小写 |
-g | --general-number-sort | 按数字排序(GNU建议只有别无选择时再使用该选项),该选项会将每行数字前缀部分转换为双精度浮点数,按照:非数字开头的行、NaNs(Not a Number)、负数、正数的顺序排序(该选项处理速度比-n选项慢得多,且可能在转换浮点数时丢失信息) |
-h | --human-numeric-sort | 按照人类可读的数字格式排序,即该选项会识别KMGTPEZYRQ等数值单位,如:1023M将排序于1G之前 |
-i | --ignore-nonprinting | 在排序时忽略非打印字符 |
-k pos1,pos2 | --key=POS1[,POS2] | 排序从POS1位置开始;如果指定了POS2的话,到POS2位置结束 |
-M | --month-sort | 用三字符月份名按月份排序,如:Jan,Feb,Mar |
-m | --merge | 合并多个多个已排序的文件,合并后的文件也是按顺序排序的,该选项会视为原文件已经排序好,只负责两个文合并时的归并排序,而不会会文件重排,速度更快 |
-n | --numeric-sort | 按字符串数值来排序(并不转换为浮点数) |
-o | --output=file | 将排序结果写出到指定的文件中 |
-R | --random-sort | 对输入的值进行哈希处理,按生成的哈希值排序 |
无 | --random-source=FILE | 指定-R参数用到的随机字节的源文件 |
-V | --version-sort | 按版本号排序,字母加数字组合将识别为版本号,且排序方法将与小数排序有所不同,如:v1,v1.4,v1.12,v1.40,v2 |
-r | --reverse | 反序排序(升序变成降序) |
-S | --buffer-size=SIZE | 指定使用的内存大小 |
-s | --stable | 禁用最后重排序比较 |
-T | --temporary-directory=DIR | 指定一个位置来存储临时工作文件 |
-t | --field-separator=SEP | 指定一个用来区分键位置的字符 |
-u | --unique | 和-c参数一起使用时,检查严格排序;不和-c参数一起用时,仅输出第一例相似的两行 |
-z | --zero-terminated | 用NULL字符作为行尾,而不是用换行符 |
wc统计字数/字节数/行数
wc [选项] [文件1 文件2 …]
- -m 统计字符数
- -c 统计字节数
- -w 统计单词数,一个单词定义为由空白、换行符等分隔的字符串
- -l 统计行数,命令会统计换行符的数量作为行数
- -L 打印最长行的长度
- 如果给定多个文件,wc命令会依次打印每一个文件的数据,最后再打印一行这些文件的总合,并以total作为文件名
uniq删除邻近重复行(uniquify)
该命令用来用于从输入中删除相邻的重复行,只保留一个副本
uniq [选项] [输入文件] [输出文件]
- 默认情况下,命令会打印输入的行,如果有相邻的重复行,则只输出一次,如果未指定输出文件,默认打印到屏幕
- -c 在每行开头打印该行重复次数
- -d 只打印邻近重复的行,但每行只打印一次
- -D 只打印邻近重复的行,该行重复几次就打印几次
- -f 值n:跳过对每行前n个字段的比较,忽略每行前n个字段的重复
- -i 忽略大小写
- -s 值n:跳过对每行前n个字符的比较
- -u 只打印非重复的行,包括两个重复,但不相邻的行
- -z 将行结束符替换为NUL,而非默认的换行符
- -w 值n:只对每行前n个字符进行比较
tr替换/删除匹配字符
tr命令用来逐字符处理字符流,对字符串进行删除、替换等操作。tr命令本身不接收要处理的字符串,因此需要通过管道符或重定向符将要处理的字符串输入给tr命令。由于是逐字符处理,因此tr命令在处理大文件时可能较慢,适合用来进行简单字符转换和清理,相当于简化版的awk
tr [选项] ‘str1’ [‘str’2]
- -d 删除指定字符,如果所输入字符串中出现了str1,删除所有str1
- -s 删除重复字符,如果所输入字符串中有相邻的重复字符,则删除到只保留一个该字符,常用来删除连续空白字符
- 如果同时指定了str1,str2,但无选项,默认是将所输入字符串中所有str1替换为str2
- -c或-C 需要指定str2,将所输入字符串中所有str1以外的字符替换为str2
- -t 将str1截断到和str2相等的长度
cut文本截取
cut命令用于从文本文件或标准输入中按列截取部分文本
cut [选项] [文件]
- -b、-c、-f选项的值可以为单个数字,也可以为范围(如:2-5),也可以为不完整的范围,如:-6表示1-6(字节/个/字段),8-表示该行第8个(字节/字符/字段)到该行结束
- -b 值:按字节截取文本
- -c 值:按字符个数截取指定文本
- -f 值:按字段截取指定文本
- -d “字符”:指定输入内容的字段分隔符,默认为制表符Tab
- -s 搭配-f使用,不打印不包含字段分隔符的行,默认情况下会打印
- --output-delimiter=”字符”:搭配-f使用,指定输出内容的字段分隔符
- -n 不要拆分多字节字符
- --complement 搭配-b、-c、-f选项使用,不打印这些区间之间的内容,即提取除指定部分以外的所有内容
格式控制
numfmt格式化输出数字
numfmt命令用于格式化输出数字,它可以将具体数值转换为易读格式(如:4000000000输出为4G),或者从易读格式转换为纯数字格式(如:4G输出为4000000000)
numfmt [选项] [数字]
- 如果未指定数字,命令将默认从stdin读取
- -d 字符:使用指定字符作为字段分隔符,默认为空格
- --format=”格式字符串”:使用printf支持格式作为输出格式,格式字符串必须包含一个%f
- --suffix=字符串:为输出的数字添加后缀,如添加单位符号,并且允许输入的数字中也携带该后缀
- --grouping 根据当前区域设置分组规则(如:是否添加千分位分隔符,)
- --header=值n:前n行不转换格式,直接输出
- --invalid=工作模式:当输入的数字出现错误时,可以使用该选项指定numfmt的工作模式,工作模式可以取以下值:
- abort:(默认)如果有错误的输入,立即退出命令,并返回状态码2
- fail:如果有错误的输入,打印其警告而不是立即退出命令,继续格式化其他数字,命令最后执行完时以状态码2退出
- warn:如果有错误的输入,打印其警告,命令最后执行完时以状态码0退出
- ignore:无视错误的输入,不打印警告信息,命令最后执行完时以状态码0退出
- --padding=值n:通过添加空格将输出数字填充到 n 个字符。如果 n 为正数,则数字将右对齐。如果 n 为负数,则数字将左对齐
- --round=方法:当值从易读格式转换为纯数字格式时,指定数字四舍五入的方法,方法可以取以下值:
- up:向上取整
- down:向下取整
- from-zero :(默认)远离零的方向舍入,不论数字是正数还是负数,都会向绝对值更大的方向舍入。即对于正数,它会向上舍入;对于负数,它会向下舍入(即变得更负)
- towards-zero:向零的方向舍入,不论数字是正数还是负数,都会向绝对值更小的方向舍入。即对于正数,它会向下舍入;对于负数,它会向上舍入(即变得更接近零)
- nearest:四舍五入
- --from=unit标准:将输入单位转换为相应数值,如果输入的值中包含K、M等单位,需要指定该选项,命令无法解析将返回错误,unit的取值参考下一个选项
- --to=unit标准:将输出值转换为相应单位,如果输出的值需要转换为K、M等单位,需要指定该选项,unit的取值如下:
- none:不执行任何转换
- si:使用国际单位制SI进行转换,K、M、G等单位是以1000为基底的转换
- iec:使用国际电工委员会(IEC)标准进行转换,K、M、G等单位是以1024为基底的转换,大于1024的值将被四舍五入,这不是完全标准,但被经常使用
- iec-i:使用国际电工委员会(IEC)标准进行转换,Ki、Mi、Gi等单位是以1024为基底的转换,大于1024的值将被四舍五入
- auto:只能用于--from选项,当输入值后单位为K、M等字符时,解析为SI标准,输入值后单位为Ki、Mi等双字母字符时,解析为IEC标准
expand将制表符转换为空格
expand [选项] [文件名]
- 默认情况下,命令会将所有制表符替换为8个空格
- -t 值:指定替换后的空格数量,默认为8。值可以指定多个,使用逗号分隔,如:-t 2,4,8 表示一行中的多个制表符依次替换为指定数量的空格
- -i 仅将每行行首的制表符转换为空格,忽略其他地方的制表符
unexpand将空格转换为制表符
unexpand [选项] [文件名]
- 默认情况下,命令只会转换每行开头的空格(非空白字符之前的空格),每8个空格会被转换为一个制表符,不足8个则不进行转换
- -t 值:指定转换的空格数量,默认为8,可以指定多个值,如:-t 2,4,8 表示一行中的多个不同数量的空格依次替换为制表符
- -a 转换所有空格,包括非行首的空格和不足连续8个的连续空格