sort
简介:顾名思义,就是用来排序的工具,在我们日常工作中对于重复列的多行输出,如果想要对内容按照特定规则排序,此时就用到了sort工具。
原理:sort 将文件的每一行作为一个单位,相互比较,比较原则默认情况是从首字符向后,依次按 ASCII 码值进行比较, 后将他们按升序输出。
语法:
sort [OPTION]... [FILE]…选项(OPTION)说明:
- -t:指定字段分隔符,示例:-t:、-t " :"
- -k:用来制定利用那列进行排序,通常-t于-k配合使用,示例:-t3、-t 2,3(排序使用字段从第2列到第3列结束,意思就是使用两个字段来排序)
- -r:按相反顺序排序,
- -n:按数值排序
- -f:忽略大小写字母
- -u:去除重复行
- -m:合并已排序的文件(仅合并)
- -o:指定输出文件
- -M:按月份排序
- -c: 检测文件是否已排序
- 示例
# 1、对/etc/passwd中以uid从大到小排序
sort -t: -k3 -n -r /etc/passwd
:<< EOF
# -t: 使用冒号':'做分隔符,如果
# -k3 冒号':'分割后用第三列来做排序
# -n 以数值排序
# -r 反序(降序)
EOF
# 2、按月份排序
sort -M file.txt
:<< EOF
cat file.txt
January
March
February
# 排序后
sort -M file.txt
January
February
March
EOF
# 3、注意
# 以下等效写法:
sort -t: -k3 -n -r /etc/passwd
sort -t : -k 3 -n -r /etc/passwd
sort -t ":" -k 3 -n -r /etc/passwd
sort -t ":" -k 3,3 -n -r /etc/passwd # -k 3,3写法更严谨
uniq
对于一些重复输出的行进行去重。(只能处理相邻的重复行)
语法:
uniq [OPTION]... [INPUT [OUTPUT]]选项(OPTION)说明:
- -c:在每行前加上该行出现的次数。
- -d:仅显示重复行。
- -u:仅显示不重复行。
- -i:忽略大小写差异。
- -f:跳过每行的前N列。
- -s:从第N个字符开始比较。
- 示例
:<< EOF
cat names.txt # names.txt 内容如下
Alice
Bob
Alice
Charlie
Bob
EOF
# uniq -ic names.txt # 这样拿不到逾期结果
sort -f names.txt | uniq -ic # 因为uniq只能处理相邻的重复行
1 Alice
2 Bob
1 Charlie
find
简介:顾名思义,就是用来在系统中查找文件的工具,可以指定一个基础起始目录,根据不同的选项查找不同的文件。
语法:
find path -option [ -print ] [ -exec -ok command ] {} \;原理:find 根据option在指定的系统路径中查找文件,如果查找到与对应的exec命令,则执行对应的command。
- print: find 命令将匹配的文件输出到标准输出;
- exec: find 命令对匹配的文件执行该参数所给出的 shell 命令。相应命令的形式为 ‘command’ {} ;,注意 {} 和 \;之间的空格;
- ok: 和 - exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行;
- 选项
- -name filename #查找名为 filename 的文件
- -perm #按执行权限来查找
- -user username #按文件属主来查找
- -group groupname #按组来查找
- -mtime -n +n #按文件更改时间来查找文件,-n 指 n 天以内,+n 指 n 天以前
- -atime -n +n #按文件访问时间来查 GIN: 0px">
- -ctime -n +n #按文件创建时间来查找文件,-n 指 n 天以内,+n 指 n 天以前
- -type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
- -size n [c] #查长度为 n 块 [或 n 字节] 的文件
- -depth #使查找在进入子目录前先行查找完本目录
- -prune #通常和 -path 一起使用,用于将特定目录排除在搜索条件之外。过滤条件写在其他条件前面。
- -maxdepth # 限制查找的最大深度
- -mindepth # 限制查找的最小深度。
- 示例
# -size
# 大于小于等于:+10k、-10k、10k
# 单位可以是:c-字节、k-KB、M-MB、G-GB
fine /path/to/search -size +10M # 寻找大于10兆的文件
# -mtime(Modify Time)
find /path/to/search -mtime -7 # 七天内的修改过的文件
# -atime(Access Time)
find /path/to/search -atime +30 # 30天前访问过的文件
# ctime(Create Time)
find /path/to/search -ctime -1 # 一天内创建的文件
# -perm
find . -perm 644 # 查找当前目录下权限为 644 的文件
# -empty
find /path/to/search -empty
find . -type f -empty # 查找当前目录下的空文件
# -exec
find . -name "*.log" -exec rm {} \; # 查找当前目录下所有 .log 文件并删除
# -delete
find . -name "*.tmp" -delete # 查找当前目录下所有 .tmp 文件并删除
# 查找并输出到文件 (-print 或重定向)
find . -name "*.txt" > output.txt # 查找当前目录下所有 .txt 文件并将结果保存到 output.txt
# -maxdepth
find . -maxdepth 2 -name "*.txt" # 限制查找的最大深度为2级
:<< EOF
# 输出结果为
file1.txt
dir1/
file2.txt
dir2/
file3.txt
EOF
- 综合示例
# 1、查找当前目录下 7 天内修改过的 .log 文件并删除
find . -name "*.log" -mtime -7 -exec rm {} \;
# 其中`{}`表示找到的路径,`\;`为固定写法,表示find命令结束
# 2、查找 /var/log 目录下大于 100MB 的文件并列出详细信息
find /var/log -type f -size +100M -exec ls -lh {} \;
# 3、查找当前目录下权限为 777 的文件并修改权限为 644
find . -type f -perm 777 -exec chmod 644 {} \;
find . -type f -perm 777 | xargs chmod 644 # 也可以使用xargs
# 4、查找当前目录下空目录并删除
find . -type d -empty -delete
date
在我们编写 Shell 的时候经常遇到需要记录日志的情况,在记录日志的时候需要打上时间戳,以便后期查看那个时间节点运行执行的操作,此时就需要用到 date 命令
简介:date 可以用来显示或设定系统的日期与时间。
- 选项
-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
-u:显示GMT;
- 时间格式:
%Y -- 年份
%m -- 月份
%d -- 当月第几天
%t -- Tab 跳格
%H -- 小时,24 小时格式 (0~23)
%I -- 小时,12 小时格式 (0~12)
%M -- 分钟 (00~59)
%S -- 秒 (00~59)
%j -- 今年中的第几天
%Z -- 以字符串形式输出当前时区
%z -- 以数字形式输出当前时区
%F -- 文件时间格式 same as % Y-% m-% d
%T -- 24 小时制时间表示 (hh:mm:ss)
- 示例
#!/bin/bash
start=$(date +%s)
echo "$(date +%F" "%T) 开始执行命令"
sleep 1 # 休眠一秒
echo "$(date +%F" "%T) 执行命令完成"
end=$(date +%s)
difference=$(( end - start ))
echo "执行命令总耗时:$difference seconds."
# 自定义时间格式
echo "$(date +%Y"年"%m"月"%d"日 "%H"时"%M"分"%S"秒")"
xargs
简介:xargs 全称是 transform arguments,意为转换参数,它将标准输入转换为命令行参数。因为 linux 命令行中经常要使用到管道符连接不同的命令,但是有些命令不支持标准输入,此时就需要使用 xargs 将标准输入转换为参数,
语法:
stdin_input | xargs [option] cmd原理:xargs 一般是通过管道符接受标准输入并将其转换为命令行参数传递给 cmd。
- 选项
- -0:输入项以 null(空字符)分隔,适用于处理包含空格或换行符的文件名。
- -I:指定替换字符串,用于在命令中替换输入项。
- -n:指定每次传递给命令的参数数量。
- -P:指定并行执行的进程数。
- -t:在执行命令前打印命令。
- -p:在执行命令前提示用户确认。
- 示例
# -0 (处理文件名有空格或特殊字符)
find . -name "*.txt" -print0 | xargs -0 -I {} cp {} /backup/
# 前半部分:查找当前目录下所有 .txt 文件,并以 null 分隔输出。
# 后半部分:将输入数据以 null 分隔解析,并逐个替换到 {} 中,执行 cp 命令,将文件复制到 /backup/ 目录。适用于处理包含空格或换行符的文件名。
# -I
echo "1.txt re.txt" | xargs -n 1 -I {} cp {} {}.bak
# 三个`{}`都表示输入字符串(即:1.txt或re.txt)
# -n
seq 1 3 | xargs -n 2 #将1~3排成两列
echo "1 2 3" | xargs -n 2 echo # 将1 2 3作为参数传递给echo
seq 1 3 | xargs -n 2 echo
# -P(并行执行)
echo "1 2 3" | xargs -n 1 -P 2 sleep # 并行执行两个sleep命令,效果:同时执行sleep 1 和sleep 2,然后执行sleep 3
# -p(交互式确认)
echo "1.log 2.log" | xargs -n 1 -p rm # 用户需要输入 y 或 n 来确认是否执行命令
# 练习
ls *.log | xargs rm -rf {} # 删除日志
find . -name "*.jpg" -o -name "*.png" -type f -print | xargs tar -cvzf images.tar.gz # 压缩图片
- 综合示例
# 查找并删除所有 .log 文件
find . -name "*.log" | xargs rm
# 查找并压缩所有 .txt 文件,压缩后不保留原文件(不安全不推荐)
find . -name "*.txt" | xargs -I {} gzip {}
# 并行处理多个任务
echo "1 2 3 4 5" | xargs -n 1 -P 2 sleep
# 处理包含空格的文件名
find . -name "*.log" -print0 | xargs -0 rm
# 批量重命名文件
ls *.txt | xargs -I {} mv {} {}.bak
# find & xargs 配合使用
find . -type f -perm 777 -exec chmod 644 {} \; # 命令1
find . -type f -perm 777 | xargs chmod 644 # 命令2
find . -type f -perm 777 -print0 | xargs -I {} chmod 644 {} # 命令3
# 分析:
# 1、三个命令在文件没有空格或特殊字符的时候功能都一样
# 2、命令2在文件名有空格或特殊字符的时候,可能会处理失败,命令1,3可以完美处理
# 3、命令1效率最低,命令2,3效率高