本篇为学习bash命令时候的学习笔记,记录常用的bash命令和关于bash的常识

常识

  • kengen 的缩写是Key Generator, 所以读的时候是key gen(坚),不要问我是怎么知道的!
  • cd的含义是“change directory”,它会改变当前目录到你指定的目录。如果你不指定,则会返回你的 home folder
  • mac中系统卷是由开始的一个正斜杠(/)表示的,目录分隔符也是正斜杠(/),如何分辨正斜杠和反斜杠?向前倾的是正斜杠,向后倾的是反斜杠,除法用正斜杠表示
  • ~是你的用户目录
  • 如果由于你忘了使用sudo而导致命令行返回一个错误,只需输入sudo !!就可以用sudo来执行上一条指令
  • sudo -s 临时切换整个命令行 shell 来取得 root 级别的访问权限
  • 输入 open . 可以用finder打开当前位置
  • 输入clear或’ctrl’+ ‘l’ 清屏
  • $_ Gives the last argument to the previous command. 表示歉意个指令的最后一个参数,所以我们创建文件并cd该文件可以写成

    1
    mkdir ~/test && cd $_
  • 在apt-get install 后加上-y参数可以防止终端询问你是否允许

  • 用wget+下载链接 下载文件
  • ssh user@hostname,例如mcl@114.212.87.56 进行ssh远程登录
  • whoami 查看当前系统的用户名
  • who 可以查看当前登录的用户
  • wc 可以统计数目,如: who | wc -l ,显示当前登录的用户的数量
  • 为什么zsh中没换行会出百分号?zsh里会有%,bash里不会有,因为输出的结果没有换行,在bash里命令提示符会直接跟在输出的结果后面也就是[]$…这种效果,而zsh里强制换行了,怕你自己不知道其实你没换行,就加了%
  • 执行一个脚本时,会先开启一个子shell环境(不知道执行其它程序是不是这样),然后将父shell中的所有系统环境变量复制过来,这个脚本中的语句就在子shell中执行。(也就是说父shell的环境变量在子shell中可以调用,但反过来就不行,如果在子 shell中定义了环境变量,只对该shell或者它的子shell有效,当该子shell结束时,也可以理解为脚本执行完时,变量消失。) 因此如果想要在当前shell中设置环境变量需要用source命令而不是sh,source会在当前shell中执行
  • du -sh 文件或目录名 可以插卡磁盘用量
  • ps -A 显示所有进程 -a显示终端中的所有进程 配合grep可以搜索某一进程
  • top 可以查看动态进程
  • lsof -i :8080 查看某一端口的占用情况

管道和重定向

  • | 如 cat ex12.txt ex13.txt | less

    将前一个命令(|之前)的输出作为下一个命令的输入,如上面的命令将ex12.txt和ex13.txt文件的内容合起来作为less的输入

  • < 如 cat < ex13.txt

    将右边文件作为输入给左边的命令

  • cat ex13.txt > ex15.txt

命令行

纪录mac命令行使用过程中的经验技巧

  • mac terminal 入门教程,这篇文章对入门很有帮助
  • 如果目录中有特殊字符(空格,括号,引号,[],!,$,&,*,;,|,\),那么直接输入空格会造成系统识别困难,必须使用特殊的语法来表示这些字符。例如上例中,空格前添加反斜杠“\”(back slash)即可:cd Punlic/Drop\ Box/。除了反斜杠,也可以用引号的方法:cd “Public/Drop Box”。
  • ls -a选项显示以.开头的文件,即显示隐藏文件。-A选项显示除了.和..以外的其他文件。
  • 远程文件复制 scp
  • 将本地文件上传到服务器上 如 scp -P 2222 /home/lnmp0.4.tar.gz root@www.vpser.net:/root/lnmp0.4.tar.gz
  • 获取远程服务器上的文件 如 scp -P 2222 root@www.vpser.net:/root/lnmp0.4.tar.gz /home/lnmp0.4.tar.gz

检视文件和文件夹

  • catcat test.file cat test1.txt >> test2.txt

    $ concatenate 按顺序读取文件并输出到 Terminal 窗口,cat命令也可以用>>来增加文本文件的内容,例如命令cat ../textOne.txt >> textTwo.txt会把 textOne.txt 的内容添加到 textTwo.txt 的结尾

  • ‘less’ 如 ‘less test.file’

    $ 适合用来查看长文本文件,和用man时候一样,打开了一个查看器,用 v 使用vi编辑器

  • ‘more’ 如 ‘more test.file’

    $ 和less一样,不过让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按Q键停止显示。

  • ‘which’ 如 ‘which man’

    $ 这个命令会定位某个命令的文件路径,which后接某个命令

  • ‘head’ 如 ‘head -n 50’

    $ 显示

  • ‘file’ 如 ‘file test.png’

    $ 这个命令会尝试根据文件的内容输出文件类型。如果一个文件缺失了扩展名,那么这个命令可能会非常有用,语法为file后接文件路径,例如图片还会给出尺寸,颜色等数值

  • 通配符 星号(*,Asterisk)如*.tiff

    $ ——代表任何长度的任何字符。例如*.tiff代表所有格式为tiff的文件。

  • 通配符 问号(?,Question mark)如 b?ok

    $ ——代表任何单个字符。例如b?ok匹配 book 但是不匹配 brook。

  • 通配符 方括号([],Square brackets) 如[Dd]ocument

    $ ——定义一定范围的字符,例如[Dd]ocument匹配 Document 以及 document;doc[1-9]匹配doc1, doc2, …, doc9。实验下来似乎是一位一位的匹配

  • -r或者-R选项,如 ls -R Desktop rm -r test

    $ 递归,递归命令可以允许命令不执行于一个特定文件,而是指定的路径下的所有文件,大多数命令包含一个

编辑文件和文件夹

  • mkdirmkdir test mkdir -p test/test1/test2

    $ 创建目录,可以用-p选项,来一起创建路径中不存在的文件夹(这样你就不用挨层创建了)

  • cpcp test1.txt test2.txt cp test1.txt test/ cp test1.txt test/test2.txt

    $ 用来把文件从一处复制到另一处,语法为cp后接原始路径,后接目标路径。如果你想复制整个文件夹和所有内容,需要添加-R选项
    如果指定的目标路径不含文件名,则 cp 命令会按原名复制,如果指定的目标路径包括文件名,则会复制为你指定的文件名。如果仅指定新文件名,则会在原处以新名称创建文件副本。注意,系统会自动替换同名文件而不出现提示。

  • mv 如’mv test1.txt test2.txt’

    $ 用来移动文件,语法为mv后接原路径,后接新路径,没错,如果仅指定新文件名,它就成了重命名命令,路径规则和cp同

  • rmrm test1.txt

    $ 永久删除文件,语法为rm后接文件路径,使用 rm 命令删除的文件有可能可以通过数据恢复工具恢复,安全删除文件,可以使用srm命令,这可以防止其他人利用命令恢复或复原文件

  • rmdir 如 ‘rmdir test’ ‘rm -R test’

    $ 永久删除文件夹,rmdir 命令无法删除含有任何其他文件的文件夹,所以大多数情形下rmdir命令是不适用的。不过,你可以利用rm添加-R选项来删除文件夹及包含的所有文件。

  • find 如 ‘find . -name “*.png”‘

    $ 这个命令根据搜索关键词定位文件路径,语法为find后接搜索的起始路径,后接定义搜索的选项,后接搜索内容(包含在引号里),注意如果你要搜索根目录,也许你想使用-x选项来避免搜索 /Volumes 文件夹。如果想使用 Soptlight 搜索服务,使用mdfind命令后接搜索关键词即可。
    进阶:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # -o 搜索条件 并
    find . \\( -name "\*.txt" -o -name "\*.pdf" \\)
    # !表示否则, 查找所有不是以.txt为后缀的文件
    $ find . ! -name "*.txt"
    # -type 按类型搜索, 只所有目录(f表示文件 l表示符号链接(软链接) d表示目录)
    $ find . -type d
    # 按用户搜索 找到所有Calvin的用户文件
    find . -type f -user Calvin
    # 按照时间搜索 -atime -30m 搜索30分钟内被访问的文件
    $ find . -atime -30m -type f -print
    # -atime +30m 搜索超过30分钟被访问的文件
    $ find . -atime +30m -type f -print
    atime 访问时间 (单位有一周w, 一天d, 一小时h, 一分钟m, 一秒s, 以下类似)
    mtime 修改时间 (内容被修改)
    ctime 变化时间 (元数据或权限变化)
    # 找到以.txt为后缀的文件后删除
    $ find . -type f -name "*.txt" -delete
  • grep$ grep 'hello' test.doc 匹配test.doc文件中所有存在hello的行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 匹配test.doc文件中所有存在hello的行
    $ grep 'hello' test.doc
    # 匹配test.doc文件中所有存在hello的行, 并打印行号
    $ grep -n 'hello' test.doc
    # 找到所有行不匹配hel或者how, -e匹配多个模式
    $ grep -v -e 'hel' -e 'how' test.doc
    # 在多级目录中对文本递归搜索
    $ grep "class" . -R -n
    #输出结果:
    ./test/class.c:1:class
    ./test/class.c:2:class yes
    ./test/class.c:4:class fuck
    ./test.doc:5:class
    ./test.pdf:1:class
    # 找到所有以.hel开头的行, 并使用管道命令
    $ cat test.doc | grep '^\.hel'
    # 找到所有包含hel行的行数(只输出行数, 没有内容)
    cat test.doc | grep -c 'hel'

grep命令是强大的文本搜索命令

awk

TODO

sed

TODO

常用工具

mtr 可以用来诊断路由节点问题

MTR 是一款强大的网络诊断工具,网络管理员使用 MTR 可以诊断和隔离网络问题,并且为上游 ISP 提供有用的网络状态报告

直接用homebrew安装: brew install mtr, 执行文件在’/usr/local/sbin/mtr’
如果出现command not found,在.zshrc中添加alias,为 alias mtr="/usr/local/sbin/mtr"
如果出现mtr: unable to get raw sockets,改变owner和执行权限

1
2
sudo chown root mtr
sudo chmod u+s mtr

tree 命令可以用来打印文件结构

tree 命令在mac下默认不存在,在ubuntu下可以用apt-get 安装,在mac下可以直接用homebrew安装: brew install tree

通常使用 -L 参数控制层级,如 tree -L 2
或使用 -d 参数只打印目录,如 tree -d
-N 参数可以用来打印中文,避免转义

参考资料