“Linux-2020-spring-4-29”的版本间的差异
跳到导航
跳到搜索
(→diff) |
(→diff) |
||
| (未显示同一用户的12个中间版本) | |||
| 第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都是基于这个来做增量存储) | ||
| 第35行: | 第41行: | ||
== 过滤器 filter == | == 过滤器 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 score.txt:跳过空格按数字排序 | ||
sort -k 3 score.txt:根据第三列排序 | sort -k 3 score.txt:根据第三列排序 | ||
| 第58行: | 第80行: | ||
sort -n -u -k 3 score.txt | uniq:一行完全一样才会删除 | sort -n -u -k 3 score.txt | uniq:一行完全一样才会删除 | ||
| − | + | == egrep == | |
-o 抽取匹配内容 | -o 抽取匹配内容 | ||
| 第67行: | 第89行: | ||
egrep -r . | egrep -r . | ||
| − | * | + | [[文件: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':把小写换成大写 | ||
| − | + | == 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
- 查看两个文本文件的差异,这个命令非常重要,其工作的原理也很重要(版本控制软件,如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 .
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