L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

Linux文本处理

字数:8092 写于:2021-12-29
最新更新:2022-01-23 阅读本文预计花费您24分钟

输出文本

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
1. 输出字符串 printf "%s %s" aa bb 2. 输出变量 printf 用户目录:%s $HOME

shuf生成随机字符串排列(shuffles)

该命令可以用来随机输出指定的文本,也可以用来生成随机值

shuf [选项] [文件]

  • -e 将每个输入的参数都视为一个本文行
  • -i 最小值-最大值:随机生成该区间之间的值(无符号整数)
  • -n 值:指定输出次数,默认为输入多少个文本,就输出多少次
  • -o 文件名:将输出结果写入到文件中,而不打印到屏幕
  • -r 生成的随机行可以重复
  • -z 行结束符为NUL,而非默认的换行符
1.将字符串name1 name2 name3按随机顺序输出: shuf >>EOF name1 name2 name3 EOF 该命令等价于 shuf -e name1 name2 name3 2. 抽奖系统(从名单中抽取一个) 将输出限制为1个: shuf -n 1 -e name1 name2 name3 2. 随机抛5次硬币 shuf -r -n 5 -e "正面" "反面" 3.随机2-10之间的值 shuf -i 2-10

seq生成连续数字队列

seq 用来生成一系列连续的数字,它可以指定数字生成的格式、增量,方便用户在脚本和命令行中,不使用循环就生成具有一定规律的数字,常用来搭配其他信息生成一些连续的字符串作为文件名等

seq [选项] [起始值] [增量] 结束值

  • 默认情况下,每个数字都将被单独打印一行
  • 如果不指定起始值或增量,则默认为1
  • 增量的值不能为0,需要重复输出某个值应当使用yes命令
  • 起始值、增量、结束值可以为inf,表示一个无穷大的值
  • 当当前数字与增量相加,值大于结束值时,命令输出会结束,因此:seq 5 5将输出5,而seq 10 5将不会有任何输出
  • -w 将数字格式化为等宽,前补0
  • -f “格式字符串”:使用指定的格式输出数字,格式可以参考C语言print语句的输出格式要求
  • -s “分隔字符”:指定输出序列中的分隔符(默认为换行符\n)
1.生成 0 到 10 的序列,增量为5,且数字宽度相同 seq -w 0 5 10 输出值为: 00 05 10 2. 生成从 1.0 到 2.0,步长为 0.2 的小数序列 seq 1 0.2 2 输出值: 1 1.2 1.4 1.6 1.8 2 3. 可以通过-f选项像C语言一样指定输出格式 seq -f "%.2f" 1 0.3 2 输出值: 1.00 1.30 1.60 1.90 4. 可以搭配其他字符串 seq -f "No.%d" 1 3 输出值: No.1 No.2 No.3 5.可以通过-s选项指定字符分隔符 seq -s ", " 1 5 输出值: 1, 2, 3, 4, 5

yes输出连续字符串

yes [字符串]

  • 默认情况下,该命令会一直输出字符’y’,后接一个换行符,直到命令被终止
  • 如果指定了一个字符串,则会持续输出该字符串
该命令可以用于以下场景 1. 某些命令在执行时需要用户重复输出y或n来确认操作,可以直接使用yes命令直接给与确认操作,避免手动输入 yes | rm -ri /mydir 2. 批量输出某个内容相同的字符串,输出10个指定字符串 echo $(yes "别刷屏" | head -n 10 | tr -d '\n') 3. 快速生成大文件以测试磁盘或某些工具的处理能力 yes "某个数据" | head -n 1000 > test_file.txt

文本处理

grep数据查找

grep命令用于在指定内容或文件中查找满足匹配模式的字符的行,其输出是满足匹配模式的字符串行。该命令功能强大,支持Unix风格的正则表达式,是最常用的命令之一。

grep [参数] 匹配模式 [文件] 找到或排除字符串所在行,然后输出内容

  • -i  不区分大小写
  • -v  排除指定字符串
  • -n  显示匹配内容的行号
  • -c  显示有多少行满足匹配
  • -e  指定多个匹配条件
示例: # grep man /etc/file 找到/etc/file文件中含有man的行并输出 # grep -v ^# /etc/inittab 显示/etc/inittab中除了#开头的所有行内容(#开头的内容为被注释了的内容,不想看注释)

sort排序处理

默认情况下,sort命令按照会话指定的默认语言的排序规则对文本数据行排序,且数字也会被当作字符处理(如果要按数值排序,使用-n选项)
sort [选项] [文件名]
将文件或命令结果进行排序,默认以每行第一个字母为依据,按字母顺序排序

  • -f 忽略大小写
  • -n 将数字作为值处理,按数值大小进行排序
  • -r 反向排序
  • -t 指定分隔符为分段依据
  • -M 按月份排序,常用于日志文件排序
  • -k n,m 指定字段为排序依据,若不指定m则判断依据为以n字段开始到本行末
示例: sort /etc/passwd 按passwd文件每行首字母进行排序显示 sort -n -t ":" -k 3,3 etc/passwd 指定字段以:分隔,按第3字段(UID)值大小进行排序显示

以下为可能用到的完整命令选项及其缩写

命令缩写 完整命令 说明
-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作为文件名
1.wc命令默认会依次显示行数、单词数、字节数、文件名 wc test.txt 输出为: 36 80 1012 test.txt 2.查看指定的选项 wc -l test.txt 输出为:36 test.txt 3.如果不想输出文件名,可以用重定向符 wc -l < test.txt

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相等的长度
1. 将输入中的所有小写字母转换为大写字母 echo "hello world" | tr 'a-z' 'A-Z' 2. 删除输入中的所有数字 echo "abc123def456" | tr -d '0-9' 3.将多个连续的空格压缩为一个空格 echo "hello world" | tr -s ' ' 4. 将所输入字符串中所有非字母字符替换为 * echo "hello 123 world!" | tr -c 'a-zA-Z' '*' 输出值: hello***world*

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选项使用,不打印这些区间之间的内容,即提取除指定部分以外的所有内容
1.截取第2-5个字符 echo "abcdefg" | cut -c 2-5 输出:bcde 2. 截取第2个字段 echo "apple,banana,cherry" | cut -d ',' -f 2 输出:banana 3. 截取文件的第二列 假设文件data.txt中有以下内容 1,John,Doe 2,Jane,Smith 执行命令: cut -d ',' -f 2 data.txt 输出值: John Jane

格式控制

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标准
1.将值转换为附带单位形式 numfmt --to=si 500000 输出:500k 2.将值转换为纯数字形式 numfmt --from=si 1M 输出:1000000

expand将制表符转换为空格

expand [选项] [文件名]

  • 默认情况下,命令会将所有制表符替换为8个空格
  • -t 值:指定替换后的空格数量,默认为8。值可以指定多个,使用逗号分隔,如:-t 2,4,8 表示一行中的多个制表符依次替换为指定数量的空格
  • -i 仅将每行行首的制表符转换为空格,忽略其他地方的制表符

unexpand将空格转换为制表符

unexpand [选项] [文件名]

  • 默认情况下,命令只会转换每行开头的空格(非空白字符之前的空格),每8个空格会被转换为一个制表符,不足8个则不进行转换
  • -t 值:指定转换的空格数量,默认为8,可以指定多个值,如:-t 2,4,8 表示一行中的多个不同数量的空格依次替换为制表符
  • -a 转换所有空格,包括非行首的空格和不足连续8个的连续空格
上一篇:sed与awk
下一篇:Linux命令补充
z z z z z