• 实用程序
    • 文件和文件夹操作
    • 管道和重定向
    • 别名
    • 文本处理

    实用程序

    文件和文件夹操作

    1. 创建/删除空目录 - mkdir / rmdir

      1. [root ~]# mkdir abc
      2. [root ~]# mkdir -p xyz/abc
      3. [root ~]# rmdir abc
    2. 创建/删除文件 - touch / rm

      1. [root ~]# touch readme.txt
      2. [root ~]# touch error.txt
      3. [root ~]# rm error.txt
      4. rm: remove regular empty file error.txt’? y
      5. [root ~]# rm -rf xyz
      • touch命令用于创建空白文件或修改文件时间。在Linux系统中一个文件有三种时间:
        • 更改内容的时间 - mtime。
        • 更改权限的时间 - ctime。
        • 最后访问时间 - atime。
      • rm的几个重要参数:
        • -i:交互式删除,每个删除项都会进行询问。
        • -r:删除目录并递归的删除目录中的文件和目录。
        • -f:强制删除,忽略不存在的文件,没有任何提示。
    3. 切换和查看当前工作目录 - cd / pwd

      说明:cd命令后面可以跟相对路径(以当前路径作为参照)或绝对路径(以/开头)来切换到指定的目录,也可以用cd ..来返回上一级目录。请大家想一想,如果要返回到上上一级目录应该给cd命令加上什么样的参数呢?

    4. 查看目录内容 - ls

      • -l:以长格式查看文件和目录。
      • -a:显示以点开头的文件和目录(隐藏文件)。
      • -R:遇到目录要进行递归展开(继续列出目录下面的文件和目录)。
      • -d:只列出目录,不列出其他内容。
      • -S / -t:按大小/时间排序。
    5. 查看文件内容 - cat / tac / head / tail / more / less / rev / od

      1. [root ~]# wget http://www.sohu.com/ -O sohu.html
      2. --2018-06-20 18:42:34-- http://www.sohu.com/
      3. Resolving www.sohu.com (www.sohu.com)... 14.18.240.6
      4. Connecting to www.sohu.com (www.sohu.com)|14.18.240.6|:80... connected.
      5. HTTP request sent, awaiting response... 200 OK
      6. Length: 212527 (208K) [text/html]
      7. Saving to: sohu.html
      8. 100%[==================================================>] 212,527 --.-K/s in 0.03s
      9. 2018-06-20 18:42:34 (7.48 MB/s) - sohu.html saved [212527/212527]
      10. [root ~]# cat sohu.html
      11. ...
      12. [root ~]# head -10 sohu.html
      13. <!DOCTYPE html>
      14. <html>
      15. <head>
      16. <title>搜狐</title>
      17. <meta name="Keywords" content="搜狐,门户网站,新媒体,网络媒体,新闻,财经,体育,娱乐,时尚,汽车,房产,科技,图片,论坛,微博,博客,视频,电影,电视剧"/>
      18. <meta name="Description" content="搜狐网为用户提供24小时不间断的最新资讯,及搜索、邮件等网络服务。内容包括全球热点事件、突发新闻、时事评论、热播影视剧、体育赛事、行业动态、生活服务信息,以及论坛、博客、微博、我的搜狐等互动空间。" />
      19. <meta name="shenma-site-verification" content="1237e4d02a3d8d73e96cbd97b699e9c3_1504254750">
      20. <meta charset="utf-8"/>
      21. <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/>
      22. [root ~]# tail -2 sohu.html
      23. </body>
      24. </html>
      25. [root ~]# less sohu.html
      26. ...
      27. [root ~]# cat -n sohu.html | more
      28. ...

      说明:上面用到了一个名为wget的命令,它是一个网络下载器程序,可以从指定的URL下载资源。

    6. 拷贝/移动文件 - cp / mv

      1. [root ~]# mkdir backup
      2. [root ~]# cp sohu.html backup/
      3. [root ~]# cd backup
      4. [root backup]# ls
      5. sohu.html
      6. [root backup]# mv sohu.html sohu_index.html
      7. [root backup]# ls
      8. sohu_index.html
    7. 文件重命名 - rename

      1. [root@iZwz97tbgo9lkabnat2lo8Z ~]# rename .htm .html *.htm
    8. 查找文件和查找内容 - find / grep

      1. [root@iZwz97tbgo9lkabnat2lo8Z ~]# find / -name "*.html"
      2. /root/sohu.html
      3. /root/backup/sohu_index.html
      4. [root@izwz97tbgo9lkabnat2lo8z ~]# find . -atime 7 -type f -print
      5. [root@izwz97tbgo9lkabnat2lo8z ~]# find . -type f -size +2k
      6. [root@izwz97tbgo9lkabnat2lo8z ~]# find . -type f -name "*.swp" -delete
      7. [root@iZwz97tbgo9lkabnat2lo8Z ~]# grep "<script>" sohu.html -n
      8. 20:<script>
      9. [root@iZwz97tbgo9lkabnat2lo8Z ~]# grep -E \<\/?script.*\> sohu.html -n
      10. 20:<script>
      11. 22:</script>
      12. 24:<script src="//statics.itc.cn/web/v3/static/js/es5-shim-08e41cfc3e.min.js"></script>
      13. 25:<script src="//statics.itc.cn/web/v3/static/js/es5-sham-1d5fa1124b.min.js"></script>
      14. 26:<script src="//statics.itc.cn/web/v3/static/js/html5shiv-21fc8c2ba6.js"></script>
      15. 29:<script type="text/javascript">
      16. 52:</script>
      17. ...

      说明:grep在搜索字符串时可以使用正则表达式,如果需要使用正则表达式可以用grep -E或者直接使用egrep

    9. 创建链接和查看链接 - ln / readlink

      1. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html
      2. -rw-r--r-- 1 root root 212131 Jun 20 19:15 sohu.html
      3. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln /root/sohu.html /root/backup/sohu_backup
      4. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html
      5. -rw-r--r-- 2 root root 212131 Jun 20 19:15 sohu.html
      6. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln /root/sohu.html /root/backup/sohu_backup2
      7. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html
      8. -rw-r--r-- 3 root root 212131 Jun 20 19:15 sohu.html
      9. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln -s /etc/centos-release sysinfo
      10. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sysinfo
      11. lrwxrwxrwx 1 root root 19 Jun 20 19:21 sysinfo -> /etc/centos-release
      12. [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat sysinfo
      13. CentOS Linux release 7.4.1708 (Core)
      14. [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat /etc/centos-release
      15. CentOS Linux release 7.4.1708 (Core)

      说明:链接可以分为硬链接和软链接(符号链接)。硬链接可以认为是一个指向文件数据的指针,就像Python中对象的引用计数,每添加一个硬链接,文件的对应链接数就增加1,只有当文件的链接数为0时,文件所对应的存储空间才有可能被其他文件覆盖。我们平常删除文件时其实并没有删除硬盘上的数据,我们删除的只是一个指针,或者说是数据的一条使用记录,所以类似于“文件粉碎机”之类的软件在“粉碎”文件时除了删除文件指针,还会在文件对应的存储区域填入数据来保证文件无法再恢复。软链接类似于Windows系统下的快捷方式,当软链接链接的文件被删除时,软链接也就失效了。

    10. 压缩/解压缩和归档/解归档 - gzip / gunzip / xz

      1. [root@iZwz97tbgo9lkabnat2lo8Z ~]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz
      2. --2018-06-20 19:29:59-- http://download.redis.io/releases/redis-4.0.10.tar.gz
      3. Resolving download.redis.io (download.redis.io)... 109.74.203.151
      4. Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected.
      5. HTTP request sent, awaiting response... 200 OK
      6. Length: 1738465 (1.7M) [application/x-gzip]
      7. Saving to: redis-4.0.10.tar.gz
      8. 100%[==================================================>] 1,738,465 70.1KB/s in 74s
      9. 2018-06-20 19:31:14 (22.9 KB/s) - redis-4.0.10.tar.gz saved [1738465/1738465]
      10. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls redis*
      11. redis-4.0.10.tar.gz
      12. [root@iZwz97tbgo9lkabnat2lo8Z ~]# gunzip redis-4.0.10.tar.gz
      13. [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls redis*
      14. redis-4.0.10.tar
    11. 归档和解归档 - tar

      1. [root@iZwz97tbgo9lkabnat2lo8Z ~]# tar -xvf redis-4.0.10.tar
      2. redis-4.0.10/
      3. redis-4.0.10/.gitignore
      4. redis-4.0.10/00-RELEASENOTES
      5. redis-4.0.10/BUGS
      6. redis-4.0.10/CONTRIBUTING
      7. redis-4.0.10/COPYING
      8. redis-4.0.10/INSTALL
      9. redis-4.0.10/MANIFESTO
      10. redis-4.0.10/Makefile
      11. redis-4.0.10/README.md
      12. redis-4.0.10/deps/
      13. redis-4.0.10/deps/Makefile
      14. redis-4.0.10/deps/README.md
      15. ...

      说明:归档(也称为创建归档)和解归档都使用tar命令,通常创建归档需要-cvf三个参数,其中c表示创建(create),v表示显示创建归档详情(verbose),f表示指定归档的文件(file);解归档需要加上-xvf参数,其中x表示抽取(extract),其他两个参数跟创建归档相同。

    12. 将标准输入转成命令行参数 - xargs

      下面的命令会将查找当前路径下的html文件,然后通过xargs将这些文件作为参数传给rm命令,实现查找并删除文件的操作。

      1. [root@iZwz97tbgo9lkabnat2lo8Z ~]# find . -type f -name "*.html" | xargs rm -f

      下面的命令将a.txt文件中的多行内容变成一行输出到b.txt文件中,其中<表示从a.txt中读取输入,>表示将命令的执行结果输出到b.txt中。

      1. [root@iZwz97tbgo9lkabnat2lo8Z ~]# xargs < a.txt > b.txt

      说明:这个命令就像上面演示的那样常在管道(实现进程间通信的一种方式)和重定向(重新指定输入输出的位置)操作中用到,后面的内容中会讲到管道操作和输入输出重定向操作。

    13. 显示文件或目录 - basename / dirname

    14. 其他相关工具。

      • sort - 对内容排序
      • uniq - 去掉相邻重复内容
      • tr - 替换指定内容为新内容
      • cut / paste - 剪切/黏贴内容
      • split - 拆分文件
      • file - 判断文件类型
      • wc - 统计文件行数、单词数、字节数
      • iconv - 编码转换
      1. [root ~]# cat foo.txt
      2. grape
      3. apple
      4. pitaya
      5. [root ~]# cat bar.txt
      6. 100
      7. 200
      8. 300
      9. 400
      10. [root ~]# paste foo.txt bar.txt
      11. grape 100
      12. apple 200
      13. pitaya 300
      14. 400
      15. [root ~]# paste foo.txt bar.txt > hello.txt
      16. [root ~]# cut -b 4-8 hello.txt
      17. pe 10
      18. le 20
      19. aya 3
      20. 0
      21. [root ~]# cat hello.txt | tr '\t' ','
      22. grape,100
      23. apple,200
      24. pitaya,300
      25. ,400
      26. [root ~]# split -l 100 sohu.html hello
      27. [root ~]# wget https://www.baidu.com/img/bd_logo1.png
      28. [root ~]# file bd_logo1.png
      29. bd_logo1.png: PNG image data, 540 x 258, 8-bit colormap, non-interlaced
      30. [root ~]# wc sohu.html
      31. 2979 6355 212527 sohu.html
      32. [root ~]# wc -l sohu.html
      33. 2979 sohu.html
      34. [root ~]# wget http://www.qq.com -O qq.html
      35. [root ~]# iconv -f gb2312 -t utf-8 qq.html

    管道和重定向

    1. 管道的使用 - |

      例子:查找当前目录下文件个数。

      1. [root ~]# find ./ | wc -l
      2. 6152

      例子:列出当前路径下的文件和文件夹,给每一项加一个编号。

      1. [root ~]# ls | cat -n
      2. 1 dump.rdb
      3. 2 mongodb-3.6.5
      4. 3 Python-3.6.5
      5. 4 redis-3.2.11
      6. 5 redis.conf

      例子:查找record.log中包含AAA,但不包含BBB的记录的总数

      1. [root ~]# cat record.log | grep AAA | grep -v BBB | wc -l
    2. 输出重定向和错误重定向 - > / >> / 2>

      1. [root ~]# cat readme.txt
      2. banana
      3. apple
      4. grape
      5. apple
      6. grape
      7. watermelon
      8. pear
      9. pitaya
      10. [root ~]# cat readme.txt | sort | uniq > result.txt
      11. [root ~]# cat result.txt
      12. apple
      13. banana
      14. grape
      15. pear
      16. pitaya
      17. watermelon
    3. 输入重定向 - \<

      1. [root ~]# echo 'hello, world!' > hello.txt
      2. [root ~]# wall < hello.txt
      3. [root ~]#
      4. Broadcast message from root (Wed Jun 20 19:43:05 2018):
      5. hello, world!
      6. [root ~]# echo 'I will show you some code.' >> hello.txt
      7. [root ~]# wall < hello.txt
      8. [root ~]#
      9. Broadcast message from root (Wed Jun 20 19:43:55 2018):
      10. hello, world!
      11. I will show you some code.
    4. 多重定向 - tee

      下面的命令除了在终端显示命令ls的结果之外,还会追加输出到ls.txt文件中。

      1. [root ~]# ls | tee -a ls.txt

    别名

    1. alias

      1. [root ~]# alias ll='ls -l'
      2. [root ~]# alias frm='rm -rf'
      3. [root ~]# ll
      4. ...
      5. drwxr-xr-x 2 root root 4096 Jun 20 12:52 abc
      6. ...
      7. [root ~]# frm abc
    2. unalias

      1. [root ~]# unalias frm
      2. [root ~]# frm sohu.html
      3. -bash: frm: command not found

    文本处理

    1. 字符流编辑器 - sed

      sed是操作、过滤和转换文本内容的工具。假设有一个名为fruit.txt的文件,内容如下所示。

      1. [root ~]# cat -n fruit.txt
      2. 1 banana
      3. 2 grape
      4. 3 apple
      5. 4 watermelon
      6. 5 orange

      接下来,我们在第2行后面添加一个pitaya。

      1. [root ~]# sed '2a pitaya' fruit.txt
      2. banana
      3. grape
      4. pitaya
      5. apple
      6. watermelon
      7. orange

      注意:刚才的命令和之前我们讲过的很多命令一样并没有改变fruit.txt文件,而是将添加了新行的内容输出到终端中,如果想保存到fruit.txt中,可以使用输出重定向操作。

      在第2行前面插入一个waxberry。

      1. [root ~]# sed '2i waxberry' fruit.txt
      2. banana
      3. waxberry
      4. grape
      5. apple
      6. watermelon
      7. orange

      删除第3行。

      1. [root ~]# sed '3d' fruit.txt
      2. banana
      3. grape
      4. watermelon
      5. orange

      删除第2行到第4行。

      1. [root ~]# sed '2,4d' fruit.txt
      2. banana
      3. orange

      将文本中的字符a替换为@。

      1. [root ~]# sed 's#a#@#' fruit.txt
      2. b@nana
      3. gr@pe
      4. @pple
      5. w@termelon
      6. or@nge

      将文本中的字符a替换为@,使用全局模式。

      1. [root ~]# sed 's#a#@#g' fruit.txt
      2. b@n@n@
      3. gr@pe
      4. @pple
      5. w@termelon
      6. or@nge
    2. 模式匹配和处理语言 - awk

      awk是一种编程语言,也是Linux系统中处理文本最为强大的工具,它的作者之一和现在的维护者就是之前提到过的Brian Kernighan(ken和dmr最亲密的伙伴)。通过该命令可以从文本中提取出指定的列、用正则表达式从文本中取出我们想要的内容、显示指定的行以及进行统计和运算,总之它非常强大。

      假设有一个名为fruit2.txt的文件,内容如下所示。

      1. [root ~]# cat fruit2.txt
      2. 1 banana 120
      3. 2 grape 500
      4. 3 apple 1230
      5. 4 watermelon 80
      6. 5 orange 400

      显示文件的第3行。

      1. [root ~]# awk 'NR==3' fruit2.txt
      2. 3 apple 1230

      显示文件的第2列。

      1. [root ~]# awk '{print $2}' fruit2.txt
      2. banana
      3. grape
      4. apple
      5. watermelon
      6. orange

      显示文件的最后一列。

      1. [root ~]# awk '{print $NF}' fruit2.txt
      2. 120
      3. 500
      4. 1230
      5. 80
      6. 400

      输出末尾数字大于等于300的行。

      1. [root ~]# awk '{if($3 >= 300) {print $0}}' fruit2.txt
      2. 2 grape 500
      3. 3 apple 1230
      4. 5 orange 400

      上面展示的只是awk命令的冰山一角,更多的内容留给读者自己在实践中去探索。