“Linux-2020-spring-4-29”的版本间的差异

来自SUDA-HLT
跳到导航 跳到搜索
→‎diff
→‎diff
 
(未显示同一用户的14个中间版本)
第11行: 第11行:
  
 
== diff ==  
 
== diff ==  
 +
 +
[[File:Linux-diff-a.txt]]
 +
 +
[[File:Linux-diff-b.txt]]
 +
 +
[[File:Linux-diff-a-vs-b.txt]]
  
 
* 查看两个文本文件的差异,这个命令非常重要,其工作的原理也很重要(版本控制软件,如svn、git都是基于这个来做增量存储)
 
* 查看两个文本文件的差异,这个命令非常重要,其工作的原理也很重要(版本控制软件,如svn、git都是基于这个来做增量存储)
** 可以是大文件,不需要预先对文件进行排序
+
** 可以是大文件,不需要预先对文件进行排序  
 +
** 也可以对文件夹进行递归对比
 
** 其输出信息的语法,要学着看懂。
 
** 其输出信息的语法,要学着看懂。
 +
 +
* diff file-A file-B
 
   对第一个文件(A)逐步修改,最终和第二个文件(B)完全一致。
 
   对第一个文件(A)逐步修改,最终和第二个文件(B)完全一致。
 
   d:删除(删除第一个文件);
 
   d:删除(删除第一个文件);
第31行: 第40行:
 
   271,373c163,271 # 将文件A的171-373行,替换为文件B的163-271行
 
   271,373c163,271 # 将文件A的171-373行,替换为文件B的163-271行
  
 +
== 过滤器 filter ==
 +
* 什么样的命令是过滤器命令?
 +
  能用在管道中。如cm1 | cmd2 | cmd3;那么cmd2就称为过滤器命令
  
 +
* cmd2有什么特点呢?
 +
  cmd2对stdin文本按行处理,结果输出到stdout中
 +
  例如:
 +
  cat 2000/*/*.txt | egrep -o '^[0-9-]+' | sort > sorted :egrep 就是一个filter
  
 +
大部分linux命令的特点(并不是说过滤器命令必须只能从stdin读,到stdout写)。
 +
* 如果没有argument,默认从stdin中读
 +
* 结果默认输出到stdout中
  
*过滤器 filter
 
  
1、什么样的命令是过滤器?能用在管道中 | cmd |
+
思考并理解:
 +
  cp不是过滤器命令
 +
  diff其实也可以作为过滤器命令使用,思考一下怎么做呢?看看diff的文档
 +
    cat a.txt | diff - b.txt | less
 +
    等价于 diff a.txt b.txt | less
 +
  非过滤命令当然也可以放到管道中,但是执行结果会比较怪
 +
    cat a.txt | ls | less
 +
    cat的标准输出(即a.txt的内容)会给到ls的标准输入,但是ls不会看标准输入的信息,所以就丢掉了
 +
    ls的结果会通过less分屏显示
 +
    因此,这个命令的执行结果和'ls | less'是完全一致的
  
2、什么样的命令可以| cmd |? cmd 对stdin文本按行处理,结果输出到stdout中。
+
     cat scores.txt | xargs ls | less
 
+
    会报错:
     cat 2000/*/*.txt | egrep -o '^[0-9-]+' | sort > sorted :egrep 就是一个filter
+
      ls: cannot access '79': no such file or directory
 +
      ls: cannot access '130': no such file or directory
 +
    为什么呢?
  
 
+
== sort ==
3、egrep ,sort :过滤器不是说一定要(而是能)从stdin到stdout。diff,cp不是过滤器。
 
 
 
4、大部分linux命令的特点:过滤器不是说一定要(而是能)从stdin到stdout。
 
    1)如果没有argument,默认从stdin中读
 
    2)输出到stdout中
 
 
 
 
 
*sort
 
 
     sort score.txt:跳过空格按数字排序
 
     sort score.txt:跳过空格按数字排序
 
     sort -k 3 score.txt:根据第三列排序
 
     sort -k 3 score.txt:根据第三列排序
第59行: 第80行:
 
     sort -n -u -k 3 score.txt | uniq:一行完全一样才会删除
 
     sort -n -u -k 3 score.txt | uniq:一行完全一样才会删除
  
*egrep
+
== egrep ==
  
 
   -o 抽取匹配内容
 
   -o 抽取匹配内容
第68行: 第89行:
 
   egrep -r .
 
   egrep -r .
  
*tr 是过滤器命令
+
[[文件:lgdpj-parser-train.log.txt]]
 +
 
 +
egrep '.*UAS.*' Lgdpj-parser-train.log.txt | egrep -o '[0-9.]*$'
 +
 
 +
== tr(典型过滤器命令) ==
 
   tr 'a-z' 'A-Z':把小写换成大写
 
   tr 'a-z' 'A-Z':把小写换成大写
  
*思考题:从当前文件夹中,所有(递归)包含3个连续数字的txt文件中,egrep -o '^[0-9-]+' |wc -l
+
== xargs命令 ==
 +
xargs命令,可以把很多非过滤器命令,放到管道中
 +
    从当前文件夹中,所有(递归)包含3个连续数字的txt文件中,egrep -o '^[0-9-]+' |wc -l
 
     find . -name '*[0-9][0-9][0-9]*.txt' | less
 
     find . -name '*[0-9][0-9][0-9]*.txt' | less
 
     find . -name '*[0-9][0-9][0-9]*.txt' | xargs egrep -o '^[0-9-]+' |wc -l:将find的输出作为参数
 
     find . -name '*[0-9][0-9][0-9]*.txt' | xargs egrep -o '^[0-9-]+' |wc -l:将find的输出作为参数
 
     find . -name '*[0-9][0-9][0-9]*.txt' | xargs cat | egrep -o '^[0-9-]+' |wc -l
 
     find . -name '*[0-9][0-9][0-9]*.txt' | xargs cat | egrep -o '^[0-9-]+' |wc -l
 
     cat `find . -name '*[0-9][0-9][0-9]*.txt'` | less :嵌套命令“~”下面的字符。
 
     cat `find . -name '*[0-9][0-9][0-9]*.txt'` | less :嵌套命令“~”下面的字符。
 +
 +
== 杂 ==
 +
  python: ord('0')
 +
  ‘0’的ascii码是48
 +
  空格' '是32, 0x20

2021年5月26日 (三) 06:07的最新版本

复习

管道 pipeline

  2000年人民日报语料的处理过程为例
  ls 2000/*/*.txt | wc -l  # 看看一共有多少个这样的文件
  cat 2000/*/*.txt | egrep -o '^[0-9-]+' | sort | uniq :-o只输出匹配上的内容
  cat 2000/*/*.txt | egrep -o '^[0-9-]+' > unsorted
  cat 2000/*/*.txt | egrep -o '^[0-9-]+' | sort > sorted 
  date; cat 2000/*/*.txt | egrep -o '^[0-9-]+' > /dev/null; date  # 两个date之间,就可以看出来这个命令的执行之间,7秒钟,为什么这么慢,是因为数据很大,每一行都很长。正则表达式效率是非常高的。
  date; cat 2000/*/*.txt | sort unsorted > /dev/null; date  # 1秒钟,大家凡事都试一试,就有切身体会了

diff

文件:Linux-diff-a.txt

文件:Linux-diff-b.txt

文件:Linux-diff-a-vs-b.txt

  • 查看两个文本文件的差异,这个命令非常重要,其工作的原理也很重要(版本控制软件,如svn、git都是基于这个来做增量存储)
    • 可以是大文件,不需要预先对文件进行排序
    • 也可以对文件夹进行递归对比
    • 其输出信息的语法,要学着看懂。
  • diff file-A file-B
 对第一个文件(A)逐步修改,最终和第二个文件(B)完全一致。
 d:删除(删除第一个文件);
 a:增加(把第二个文件的内容增加到第一个文件);
 c:替换
 <:文件A的内容
 >:文件B的内容
 diff sorted sorted_uniq | nl | less
 130d129:删除文件A的第130行,删掉的内容对应文件B的129行
 132,133d130:删除文件A的第132-133行,删掉的内容和文件B的130行对应;注意使用的是原始文件的行号,而不是把前面的操作都做完后更新的行号;这样做当然更容易对比
 diff unsorted sorted | nl | less
 1,120d0 (删掉的内容和文件B的0行对应)
 249a130,131 # 把文件B的130-131行,增加到文件A的249行下面
 > B的130行
 > B的131行
 271,373c163,271 # 将文件A的171-373行,替换为文件B的163-271行

过滤器 filter

  • 什么样的命令是过滤器命令?
 能用在管道中。如cm1 | cmd2 | cmd3;那么cmd2就称为过滤器命令
  • cmd2有什么特点呢?
 cmd2对stdin文本按行处理,结果输出到stdout中
 例如:
 cat 2000/*/*.txt | egrep -o '^[0-9-]+' | sort > sorted :egrep 就是一个filter

大部分linux命令的特点(并不是说过滤器命令必须只能从stdin读,到stdout写)。

  • 如果没有argument,默认从stdin中读
  • 结果默认输出到stdout中


思考并理解:

 cp不是过滤器命令
 diff其实也可以作为过滤器命令使用,思考一下怎么做呢?看看diff的文档
   cat a.txt | diff - b.txt | less
   等价于 diff a.txt b.txt | less
 非过滤命令当然也可以放到管道中,但是执行结果会比较怪
   cat a.txt | ls | less
   cat的标准输出(即a.txt的内容)会给到ls的标准输入,但是ls不会看标准输入的信息,所以就丢掉了
   ls的结果会通过less分屏显示
   因此,这个命令的执行结果和'ls | less'是完全一致的
   cat scores.txt | xargs ls | less
   会报错:
     ls: cannot access '79': no such file or directory
     ls: cannot access '130': no such file or directory
   为什么呢?

sort

   sort score.txt:跳过空格按数字排序
   sort -k 3 score.txt:根据第三列排序
   sort -n -k 3 score.txt
   sort -r -n -k 3 score.txt
   sort -r -n -u -k 3 score.txt:倒序
   sort -n -u -k 3 score.txt:排序的内容相同就删除
   sort -n -u -k 3 score.txt | uniq:一行完全一样才会删除

egrep

  -o 抽取匹配内容
  -n 显示行号
  -v 取反
  -i大小写不敏感
  -r/-R/--recurisive dir必须给定文件夹参数
  egrep -r .

文件:Lgdpj-parser-train.log.txt

egrep '.*UAS.*' Lgdpj-parser-train.log.txt | egrep -o '[0-9.]*$'

tr(典型过滤器命令)

 tr 'a-z' 'A-Z':把小写换成大写

xargs命令

xargs命令,可以把很多非过滤器命令,放到管道中

    从当前文件夹中,所有(递归)包含3个连续数字的txt文件中,egrep -o '^[0-9-]+' |wc -l
    find . -name '*[0-9][0-9][0-9]*.txt' | less
    find . -name '*[0-9][0-9][0-9]*.txt' | xargs egrep -o '^[0-9-]+' |wc -l:将find的输出作为参数
    find . -name '*[0-9][0-9][0-9]*.txt' | xargs cat | egrep -o '^[0-9-]+' |wc -l
    cat `find . -name '*[0-9][0-9][0-9]*.txt'` | less :嵌套命令“~”下面的字符。

 python: ord('0')
 ‘0’的ascii码是48 
 空格' '是32, 0x20