前后花了一周的时间,学习了9个命令,分别是 find, xargs, grep,sed,tr,awk,cut,sort,uniq。
开启了linux命令学习的旅程,进了文件管理和文本处理的坑。
学习一个命令,要掌握它的使用,一个是要彻底理解这个命令的使用规则,输入和输出是怎样的,另一个是多多练习。
当有需求的时候,多用命令行去操作。
find:
find filepath -options expression
在指定目录下,按照一定的条件搜索出文件。
搜索条件就是文件的属性,比如大小,名称,所有者,访问权限,访问时间。
-print
-print0 输出内容,边界符为'\n' 或 '\0'
-name 按照文件名查找
-exec 对查询到的结果执行相关操作
-regex 正则表达式
-maxdepth 最大查找深度
-mindepth
-iregex 忽略大小写的正则表达式
! 输出为不匹配条件的结果
-prune 排除指定条件的结果。
重点:很多时候我们不单单是为了搜索文件,而是在这些结果上做一些操作。
-exec
find . -name "*.c" -exec chmod 644 {} \;
{} 是一个变量,值为查询的结果的每一个文件名,上面的意思就是对每一个文件名执行该命令。
涉及到多个条件:
同时满足,与条件:直接写多个选项即可
满足一个即可,或条件:-name "*.pdf" -o -name "*.txt"
排除某个目录:
find . \( -name "flasky" -prune \) -o \( -name "*.txt" -print \)
排除了名字为flasky的目录,后一个是要查询的条件语句。
xargs:
将标准输出格式化为参数列表,这个列表作为命令行参数,传给下一个命令。格式的过程是,把输入根据一个边界符进行切分,得到一个列表,默认为空格符(空格、换行、制表)
commands |args commands2
cat a.txt|xargs
hjdkfjsd ksdjfksdjf ksjdfksjf s dio iksjdfkjsdkfjsd ksjdfksdjfks hello
-n 指定一行有多少个参数
-d 指定切分的边界符
-I 对参数列表进行迭代,而非整体作为参数。每个参数都执行一遍。
cat a.txt|xargs -I {} echo hello {}
与find合在一起使用:
找到所有txt文件,然后把他们删掉。
find . -name "*.txt" -print0 |xargs -0 rm -f
grep:
指定搜索的串,和要搜索的文件或目录,进行搜索。输出为匹配的一整行内容。
和find 比较起来,find是按照文件属性搜索,先指定搜索范围,再指定条件。一个是按照文件内容搜索,先指定条件,再指定搜索范围。
grep "match_pattern" file_path -options
思考一下,我们对于文本检索都有怎样的需求呢?
从某个文件中查指定的串,ctrl+f
全局搜索,看代码的时,对整个项目搜索,看哪里使用过某个串或某几个串。
忽略大小写的搜索
搜索不匹配的部分(这个好像有点奇葩)
有时候对内容不感兴趣,在乎哪些文件包含了想要的内容。输出文件名。
替换。找到某个串,进行替换(当然,光用grep做不到这些。)
搜索条件:
-i 忽略大小写
-E 使用正则表达式 或egrep
-e 连接多个匹配,满足其中的一个即可。
搜索目录调整:
-r 对指定目录进行遍历搜索
-include 根据文件名指定范围
-exclude 排除指定的文件
结果过滤:
-l 输出所在的文件名。
-c 统计匹配的总行数,不是出现的个数,有可能一行有多个。
-o 只输出匹配到的文本部分,而不是一整行。
-v 输出不匹配的行。
-n 输出所在行号。
-b 输出所在列号。
-A 3 输出匹配的行以及后面3行
-B 3 输出匹配的行以及前面3行
-C 3 输出匹配的行以及前后3行
sed
有两个可以替换的命令,sed是其中一个比较强大的工具。
替换的过程是: 先匹配需要替换的内容(正则表达式),指明替换后的内容。
sed "pattern_stirng" file
"s/patern/replace_string/g"
对文件按照partern 进行匹配,把所有匹配的项使用replace_string进行替换。
/ 是指令字串的分隔符,也可以用 : | 分隔
g前面有一个系数,表示从第几个匹配项开始替换。
每一个匹配都会保存到变量&中,可以使用&进行加工处理。
'/pattern/d' 把匹配的字符删掉,也就是用空字符替换掉。
子串匹配: 在pattern 里使用()进行区分,在替换的时候,使用\1表示第一个括号的子匹配进行代替。
通常用于,匹配后的部分需要调整的情况。例,对于拥有两个单词的一行,调整两个单词的顺序。
sed 's/\(\w\+\) \(\w\+\)/\2 \1/g' a.txt
-i 把替换作用到原文件中。
tr
另一个替换的命令。与sed不同的是,它是字符集合的操作。通过两个集合的一一对应关系,做出替换。
可以理解成这是一个译码和解码的过程。用set2 对set1进行译码。如果要解码,交换set1,set2的顺序即可。
tr set1 set2
由于是一一对应的关系,如果前者小于后者,则重复最后一个字符;如果大于后者,则忽略多余的字符
-c set 获得set的补集,全集是输入流的内容。
-d set 删除输入中的所有字符集合内的字符。
-s set 删除多余连续的set中的字符,留一个。
tr和sed 什么时候是一样的?如果是一个字符换另一个字符,没有区别。
awk
对文件进行迭代时如果要执行相关的操作,可以使用awk。这个工具简直屌爆了,对内容进行迭代。
如果有对内容进行筛选,统计等。可以联系一下这个工具。
awk 'BEGIN{begin statements}{}END{end statements}' a.txt
指令结构:
1.BEGIN{begin statements} 迭代前的操作,声明变量等
2.{} 迭代每一行后执行的操作
3.END{end statements} 文件迭代完毕的操作。
其中,1,2,3任意一个都是可以省略的。
用来计算一个文件的行数(当然,用awk来做这种简单的事情,就是对awk的污辱):
awk 'BEGIN{i=0}{i++}END{print i}' a.txt
可以看到,{} 里面包含的是可执行的语句。
多条的语句用;分隔。
一些超级好用的变量:
当前行行号:NR,统计行数的时候,直接在结尾输出这个也可以。 awk 'END{print NR}' a.txt
当前的段数:NF,以空格字符作为分隔。
当前行的内容: $0
当前行某个段的内容:$1
它竟然还能实现类似grep 的功能,根据查找条件搜索,输出匹配的行。
awk '/linux/' a.txt
awk '!/linux/' a.txt
行号条件:
awk 'NR<5' a.txt
awk 'NR==1,NR==4' a.txt
-F 由于计算段数默认是按照空白字符来算的,如果是其他的,就要调整定界符。
awk -F: '{print NF}' a.txt
awk 'BEGIN{FS=":"}{}' a.txt
cut
根据字段,字符,字节等作处理。 要注意的是,默认定界符为制表符‘\t’。
它能够做的事情就是,把文件看成一个表格,把具体的列找出来。
cut -option filiename
-f 按段数分割
--complement 取补集操作
-d 指定定界符
-c 按字符输出
-b 按字节输出
可以这样指定范围,N-(第N个到最后) N-M -M(第一个到第M个)
sort
对文件按照一定的规则排序,这个命令也不错,虽然简单,但是给工作带来了极大的方便。
commands |sort -options filename
sort -options filename
options 指定 按照怎样的规则排,以哪一列为标准排,逆序还是正序。
无 按字典序
-n 按数字
-d 按字典
-k 指定列 这里的字段用的是空格字符,如果是按其他分隔,需要先替换成空格字符。
-r 逆序
uniq
去除连续重复的内容。常与sort连用。
uniq filename
commads|uniq
一般需要先将数据排序,再使用uniq命令,否则会出现错误和遗漏。uniq只检查连续的行。
-c 统计各行出现的次数
-d 输出所有连续重复的行
-s -w 选择一行中的某个范围作为比较对象。-s a 忽略前a个字符,从a+1开始 -wb 比较的字符数为b
一下子撸了九个命令,脑袋一片空白,突然感觉到什么都没学到一样。
总结一下,不要为了学命令而学,一定要有具体的使用场景和需求。
其次,提到一个命令,一定要在脑海里回忆以下四点,经常思考,做到融汇贯通:
1.它是做什么的?能帮我解决怎样的问题?
2.它的格式是怎样的?通过输入什么,得到怎样的输出?
3.它有哪些选项,各个选项的作用又是怎样的?
4.使用的时候有什么需要注意的地方?
用ubuntu有一段时间了,接下来会总结一些常用的系统命令和系统相关的内容。