基本指令使用

基本命令的使用

用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指令的使用

  • 一般情况下,指令的连续使用是这样的
    cat foo.txt | grep "test"
    # 将前一个指令的stdout重定向到另一个指令的stdin
    
    但是有些指令只能以命令行参数的形式接受数据,无法通过stdin接受数据流,就需要有一个工具可以将标准输入数据转换成命令行参数,这恰恰是xargs指令的作用。
  • 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符合条件的最长字符串。
    ## #与##也有类似的效果。
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 10,193评论 3 53
  • 基本命令-2 压缩和归档 打包: 即归档,类似于旅游之前收拾行李 压缩: 为了减少占用的磁盘空间,可以做备...
    崔千易阅读 972评论 0 0
  • 第1章 小试牛刀 $ 是普通用户,# 表示管理员用户 root。 shebang:#!。sharp / hash ...
    巴喬書摘阅读 6,423评论 1 4
  • 我是复读生 终于再经过一年努力后 我考上了二本 来到了滁院 我心里不甘心 因为我最想去的地方是帝都 那儿强烈的吸引...
    救世主一世阅读 250评论 0 0
  • 你是清晨的第一缕阳光, 朝霞里满含着憧憬洒进我的心房。 你是午后那株百合, 美丽倩影散发着耀眼的光芒。 你是细雨中...
    山外来客_42cb阅读 168评论 1 6