shell正则表达式

sort命令

以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序

比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

sort 对行内容进行升序排序

XXX | sort 选项 sort 选项 文件

常用选项:

|------------------------|----------------------------|
| -n | 按照数组进行排序 |
| -r | 反向排序 |
| -u | 排序后去重(表示相同的数据仅显示一行) |
| -t '字段分隔符' -k 字段序号 | 根据-t 指定的分隔符的第 k个字段进行排序 |
| -k | 指定排序字段 |
| -o <输出文件> | 将排序后的结果转存至指定文件 |
| -f | 忽略大小写,会将小写字母都转换为大写字母来进行比较 |
| -b | 忽略每行前面的空格 |

uniq 对连续的重复行进行去重

XXX | uniq 选项 uniq 选项 文件

常用选项:

|----|---------------------|
| -c | 对连续的重复行进行去重,并统计重复次数 |
| -d | 仅输出连续重复的行 |
| -u | 仅输出不连续重复的行 |

tr 对输入的内容进行替换

XXX | tr 选项 '参数1' ['参数2']

常用选项:

|----|-------------------------------------------|
| -t | tr命令的默认选项,使用 参数2 的字符替换成 参数1 的字符 |
| -c | 仅保留 参数1 的字符,其它字符(包括\n)都替换成 参数2 的字符 |
| -s | 根据 参数1 进行去重,如果有 参数2 则再用 参数2 的字符替换 参数1 的字符 |
| -d | 删除所有 参数1 的字符 |

删除空行

cat 文件 | grep -v "^$"

cat 文件 | tr -s "\n"

Windows的另起一行格式(\r\n)转换成 Linux的另起一行格式(\n)

cat 文件 | tr -d '\r' > 新文件

dos2unix 文件

对数组排序

echo ${数组名[@]} | tr ' ' '\n' | sort -rn | tr '\n' ' '

cut 对行内容进行字段截取

XXX | cut 选项 参数

|--------------------------|----------------------------|
| -d '分隔符' -f 字段序号 | 根据 -d 指定的分隔符的截取显示 -f 指定的字段 |
| --complement | 取反,不显示 -f 指定的字段 |
| --output-delimiter '分隔符' | 指定输出的字段分隔符 |

字符串分片

echo ${变量:下标:长度} #下标起始从0开始

echo $变量 | cut -b 起始下标-终止下标 #下标起始从1开始

expr substr $变量 起始下标 长度 #下标起始从1开始

split 按照格式拆分文件

|----|----------------|
| -l | 根据行数分割文件 |
| -b | 根据大小分割文件 |
| -d | 输出的目标文件后缀用数字替代 |

如何将一个10G文件分割为10个1G的文件 split -b 1G -d 原文件 目标文件名前缀

如何将一个100行文件分割为10个10行的文件 split -l 10 -d 原文件 目标文件名前缀

paste 将多个文件按照列进行合并

paste 选项 文件1 文件2 ...

|----------|------------|
| -d '分隔符' | 指定输出的字段分隔符 |
| -s | 将每个列横向输出 |

合并文件的行 cat 文件1 文件2 ... > 新文件

合并文件的列 paste -d '分隔符' 文件1 文件2 ... > 新文件

eval 在命令行执行前,先将命令行里的变量置换成对应的值后,再执行命令

a=100

b=a

eval echo \$$b 置换成--> echo $a 执行-> 100

eval $b=50 置换成--> a=50 执行

echo $a -> 50

通配符和正则表达式的作用范围:

通配符 作用范围 匹配文件/目录名

正则表达式 作用范围 匹配文件内容

正则表达式元字符

基础元字符

|-----------|----------------------------------------------------------------|
| \ | 转义字符,将一些特殊符号转义成普通字符 \? \! \\ 将一些普遍字母字符转义成特殊字符 \n \t \r |
| ^ | 匹配以指定字符串开头的 ^XXX |
| $ | 匹配以指定字符串结尾的 XXX$ ^$ |
| . | 代表除了 \n 以外的任意字符 |
| [XXX] | 匹配中括号里的列表中的任意一个字符 [.\n] [0-9] [a-zA-Z0-9] |
| [^XXX] | 匹配除了中括号里的列表中的任何字符 [^0-9]匹配所有非数字的字符 [^a-zA-Z]匹配所有非大小字母的字符 |
| * | 匹配*前面的字符或表达式任意次数(包括0次 1次或多次) .* [0-9]* |
| {n} | 匹配{}前面的字符或表达式 n 次 |
| {n,} | 匹配{}前面的字符或表达式至少 n 次(大于等于 n 次) |
| {n,m} | 匹配{}前面的字符或表达式 n 到 m 次(大于等于 n 次且小于等于 m 次) |

(注:grep sed 使用时 {} 前面要加 \ ;egep awk grep -E sed -r 使用时 {} 前面不用加 \)

扩展元字符

|----|-------------------------------|
| + | 匹配+前面的字符或表达式至少1次(大于等于1次 {1,}) |
| ? | 匹配?前面的字符或表达式0次或1次({0,1}) |
| () | 将()里的表达式作为一个整体 (oo)* (oo)? |
| | | 或 (oo|aa) (oo|aa)? |

相关推荐
孑渡15 分钟前
【LeetCode】每日一题:跳跃游戏 II
python·算法·leetcode·游戏·职场和发展
ka2x20 分钟前
订单折扣金额分摊算法|代金券分摊|收银系统|积分分摊|分摊|精度问题|按比例分配|钱分摊|钱分配
java·c语言·c++·python·算法·spring·spring cloud
职略2 小时前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
A22742 小时前
LeetCode 196, 73, 105
java·算法·leetcode
阿里巴巴P8资深技术专家3 小时前
Java常用算法&集合扩容机制分析
java·数据结构·算法
zengson_g4 小时前
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
java·数据库·算法·排序算法
爱上电路设计4 小时前
有趣的算法
开发语言·c++·算法
Kerry_67 小时前
2024年江苏省研究生数学建模科研创新实践大赛C题气象数据高精度融合技术研究论文和代码分析
算法·数学建模·matlab·数据分析
风啊雨7 小时前
刷题Day44|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
算法
yachihaoteng7 小时前
Studying-代码随想录训练营day27| 贪心算法理论基础、455.分发饼干、376.摆动序列、53.最大子序和
c++·算法·leetcode·贪心算法