基本命令的使用
用cat进行拼接
- 用cat指令将标准输入和输入文件file.txt的内容拼接在一起,-被作为来自stdin文本的文件名。
echo 'Text through stdin' | cat - file.txt
- 读取file.txt文件中的内容,并将文本中多个连续的空白行压缩成一个空白行。
cat -s file.txt
- 使用cat指令,将制表符显示为^|,在python文件读取时,用处比较大。
cat -T file.py
- 在cat的输出内容中,添加行序号
cat -n lines.txt
录制和回放终端会话
- 录制终端会话,并生成记录文件.-t选项将时序数据导入stderr,而后将stderr重定向到timing.log中,-a选项将指令执行的输出记录到指定文件output.session中。
script -t 2> timing.log -a output.session type commands; ... ... exit
- 借助时序数据文件、指令输出数据文件,回放指令执行过程
scriptreplay timing.log output.session
- 借助script、scriptreplay指令,实现指令实时广播
#启动两终端广播 Terminal_1: mkfifo scriptfifo Terminal_2: cat scriptfifo Terminal_1: script -f scriptfifo # 广播过程启动完毕,Terminal_1是广播员,Terminal_2作为听众 #Terminal_1上的任何指令操作,在Terminal_2上都会同步播放 #此情况下,任何运行指令cat scriptfifo的终端都可以作为听众 #结束两终端广播 Terminal_1: exit
文件查找与文件列表
- 列出当前目录和子目录下所有文件以及文件夹
find base_path -print #从base_path位置开始向下查找 #-print选项指明打印出匹配文件的文件名,并将\n作为分隔文件的定界符 #-print0选项将\0作为分隔符,适用于文件名中包含换行符的时候
- 根据文件名或者正则表达式匹配搜索
find /home/fmr -name "*.txt" -print find /home/fmr -iname "*.py" -print0 #-name选项指定了文件名必须匹配的字符串,可以将通配符作为参数使用 #-iname选项类似-name选项,只不过会忽略字母大小写 find /home/fmr -path "*flinux*" -print #-path选项会将文件路径作为一个整体进行匹配,而不单单是文件名 find . \(-name "*.txt" -o -name "*.pdf"\) -print #使用or操作,匹配多个条件中的一个
- 否定参数的使用
find . ! -name "*.txt" -print #匹配所有不以txt结尾的文件名
- 基于目录深度、文件类型的搜索
find . -mindepth 2 -type f -print find . -maxdepth 3 -type f -print #-maxdepth参数指定最深查找到第几层 #-mindepth参数指定从第几层开始查找 #-type参数指定查找什么类型的文件,f表示普通文件 #先设置查找深度,再设置查找文件的类型,提高find执行效率
- 根据文件时间进行检索
#以“天”为计量单位 #访问时间 -atime 用户最近一次访问文件的时间 #修改时间 -mtime 文件内容最后一次被修改的时间 #变化时间 -ctime 文件元数据(权限或所有权)最后一次改变的时间 #以“分钟”为计量单位 #-amin 访问时间 #-mmin 修改时间 #-cmin 变化时间 find . -type f -atime -7 -print #打印出在最近7天内被访问过的文件 find . -type f -atime 7 -print #打印出恰好在7天前被访问过的文件 find . -type f -atime +7 -print #打印出访问时间超过7天的所有文件
- 基于文件大小进行搜索
find . -type f -size +7k #查找大于7k的文件 find . -type f -size -2k #查找小于2k的文件 find . -type f -size 2k #查找大小为2k的文件
- 删除匹配的文件, -delete选项
find . -type f -name "*.swp" -delete #删除当前目录下的所有.swp文件
- 基于文件权限、文件所有权进行匹配
find . -type f -perm 644 -print #打印出权限为644的文件 find . -type f -user fmr -print #打印出用户fmr所拥有的文件
- 结合find指令执行命令或者动作, -exec选项
sudo find . -type f -user root -exec chown fmr {} \; #查找当前目录下,root用户拥有的文件,并将拥有者改为fmr #对于每一个匹配的文件,{}会被替换成相应的文件名
xargs指令的使用
- 一般情况下,指令的连续使用是这样的
但是有些指令只能以命令行参数的形式接受数据,无法通过stdin接受数据流,就需要有一个工具可以将标准输入数据转换成命令行参数,这恰恰是xargs指令的作用。cat foo.txt | grep "test" # 将前一个指令的stdout重定向到另一个指令的stdin
- xargs指令会把从stdin收到的数据重新格式化,再将其作为参数提取给其他指令使用。
#将多行输入转换成单行并输出 cat example.txt 1 2 3 4 5 6 7 8 9 10 11 12 cat example.txt | xargs 1 2 3 4 5 6 7 8 9 10 11 12
#将单行输入转换成多行输出 #xargs指令的-n选项,可以指定转换后每行最大的参数数量 cat example.txt | xargs -n 3 1 2 3 4 5 6 7 8 9 10 11 12 #使用-d选项输入一个自定义的定界符 echo "splitXsplitXsplitXsplitXsplit" | xargs -d X split split split split split
- xargs指令的特殊使用方法
cat args.txt #范例文件 arg1 arg2 arg3 cat args.txt | xargs -I {} more -p {} -l # 这条指令实际上的运行效果如下: # more -p arg1 -l # more -p arg2 -l # more -p arg3 -l # -I指定了一个替换字符串{},这个字符串在xargs执行时候会被替换掉。 # 字符串{}会被从stdin读取到的参数所替换。 # {}在每次执行中会被替换为相应的参数。
# 结合find使用xargs find . -type f -name "*.txt" -print | xargs -0 rm -f # 查找当前目录下所有txt文件,\0作为find指令输出结果的定界符。 # 统计当前目录下,C程序文件的行数 find . -type f -name "*.c" -print0 | xargs -0 wc -l
tr转换指令的使用
- 实现大小写转换
echo "HELLO WHO IS THIS " | tr 'A-Z' 'a-z' ## 可以使用起始字符-终止字符这种格式, ## 如果起始字符-终止字符不是一个连续的字符序列, ## 那么它就会被视为一个包含了三个元素的集合(起始字符-终止字符)。
- 使用tr指令将指定文本中的制表符转换成空格
cat file_name.txt | tr '\t' ' '
- 使用tr删除字符
echo "Hello 123 world 456" | tr -d '0-9'
cat file_name.txt | tr -s ' ' ## 压缩file_name文件中的空格字符
排序、单一与重复
- sort指令既可以从stdin中获取输入,也可以从特定的文件读取,并将排序后的结果写入stdout。
## 对一组文件进行排序 ## 并找出已排序文件中的不重复的行 sort file1.txt file2.txt -o sorted.txt cat sorted.txt | uniq > uniq_linex.txt
- 使用sort指令按照数字顺序的逆序进行排序
sort -n -r sorted.txt
- 使用sort指令,按照列进行排序
sort -nrk 1 data.txt ## 按照data.txt文件的第一列数据的数字逆序, ## 进行排序,排序结果写入stdout。
- uniq指令的使用
## 统计各行在文件中出现的次数 sort data.txt | uniq -c ## 找出并输出文件中重复的行 sort data.txt | uniq -d ## -s跳过前2个字符、-w指定用于比较的最大字符数为2 sort data.txt | uniq -s 2 -w 2
- 需要注意的是,当我们将uniq指令的输出作为xargs指令的输入的时候,最好为输出的各行添加一个0值字节终止符。默认情况下,xargs指令使用空格作为定界符,来分割参数。例如说,来自stdin的文本行"this is a lline"在默认情况下,会被xargs当作4个不同的参数,但是实际上它只是一个单行,如果在上一个uniq指令中为每一行末尾添加0值字节终止符,再使用xargs -0,就可以以\0为定界符,这样一来,包含空格的单行就可以被正确的解析为单个参数
uniq -z file.txt | xargs -0 rm ## 删除在file.txt中指定文件名的文件
临时文件名和随机数的使用
temp_file=$(tempfile) ## 为变量tempfile赋值一个临时文件夹名称 ## 而环境变量$RANDOM总是返回一个随机数 temp_file="/tmp/var.$$" ## .$$会被扩展成当前运行脚本的进程ID
分割文件和数据
split -b 10k data.file -d -a 4 ## -b选项指定了每个小文件的大小 ## -d选项指定将数字作为小文件后缀 ## -a选项指定后缀名的长度为4位
根据扩展名切分文件名
## 借助%操作符,可以将名称部分从“名称.扩展名”这种格式的文件名中提取出来。 file_jpg="sample.jpg" name=${file_jpg%.*} ## 借助#操作符,可以将扩展名从“名称.扩展名”格式的文件名中提取出来。 file_jpg="sample.jpg" extension=${file_jpg#*.}
${VAR%.*} ## 从$VAR中删除位于%右侧的通配符所匹配的字符串,从右向左匹配。 ## 给VAR赋值,通配符从右向左匹配,会匹配到扩展名。 ## 匹配到扩展名后,从$VAR中删除匹配结果,得到文件名。 ## %属于非贪婪操作,从右向左找出匹配的最短结果。 ## %%与%功能一致,但却是贪婪匹配,会匹配i符合条件的最长字符串。 ## #与##也有类似的效果。