基本指令使用

基本命令的使用

用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符合条件的最长字符串。
    ## #与##也有类似的效果。
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

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