Linux 基础命令、文档树 和 bash

时间:2022-05-28 23:33:26

最近发现了一个总结得更好的:bash cheatsheet


本文只是我对 linux 基础学习的一个总结,可能仅适用于复习用。算是我的 Linux 备忘录。

最基础

  • tab 补全
  • * 通配符
  • ctrl-c 中断当前进程 (以下几个快捷键可使用 stty -a 查看)
  • ctrl-d EOF或者exit
  • ctrl-r 反向查找命令历史
  • history 查看命令历史
  • reset 通过重启完全清空窗口(慢)
  • clear 通过翻页实现窗口清空(快)
  • shift+page down/up 窗口翻页

命令行编辑-快捷键(M 表示 Meta, 指 ALT 键)

  • commands for moving
    • ctrl-a 光标移到行首
    • ctrl-e 光标移到行末
    • meta-f 光标前进一个单词
    • meta-b 光标后退一个单词
    • ctrl-l 等同于clear
  • commands for killing
    • ctrl-w 从当前光标,向前删除到空格
    • meta-d 从当前光标,向后删除到空格
    • ctrl-k 删除光标后面的所有内容
    • ctrl-u 清空当前命令行

指令/档案帮助:

  • man page(manual 说明文档)(man的说明见man man)
  • 程序说明文档 usr/share/doc

系统状态:

  • who 当前在线用户
  • netstat 网络状态
  • ps -aux 正在活动的进程
  • ls 即list,列出当前目录下的文档/目录
  • ls -l 列出文档的同时,还列出其权限等信息
  • ls -a 列出所有文档,包括隐藏文档和 . ..

文件搜索:

  • which 只搜索 PATH 下的所有程序
  • whereis 只查询特定目录下的文档(使用完全匹配),主要是/usr/share/man /usr/src等,可用-l选项查看被查询的目录。
  • locate 关键字匹配,并且使用预建索引,索引可使用updatedb手动更新。
  • find PATH option action 在指定目录中递归查找能匹配的 文件/目录。
    • find . -name '*.png' 查找当前目录下的所有png图片。
    • 经常和 xargs 一起用于批量操作:find 目录 -name 名称|xargs rm -rf,批量删除名字内带有特定字符的文件。

文档抓取(通常是针对行的操作,复杂的操作建议用 python)

  1. cut(从每一行中,仅取出需要的部分)
  2. grep -[vniwc] 'pattern' file(从所有行中,仅取出需要的行,pattern 部分使用正则表达式)
    • grep --color=auto 'pattern' filename
    • v 反匹配,列出不被匹配的行
    • n 显示行号
    • i 忽略大小写
    • w 单词完全匹配
    • c 计数匹配到的行
    • 全文搜索:grep ‘string-pattern' [path-pattern] -r,在匹配到的所有文档内搜索 string-pattern
  3. sed 按行进行的修改替换命令(行是基本单位)
  4. awk 针对每行的一部分进行的修改替换命令(行的一部分是基本单位)
  5. uniq 重复的行只列出一个
  6. wc 字符计数
  7. tee 单入口、双出口的管道,在需要检视中间流时很有用
  8. sort 按行排序
  9. diff 档案对比工具
    • -y选项:side-by-side显示,特别实用

系统控制:

  • shutdown -h now 正常关机(poweroff)
  • shutdown -r now 正常重启(reboot)
  • systemctl 管理命令
  • tty-x切换:ctrl+alt+f-x
  • 字符集:locale 或 echo $LANG
  • time 指令: 输出指令执行所用的时间

目录操作

  • cd (change directory)
  • pwd (print work directory)
  • mkdir -[mp] (make directory)
    • m选项 设定权限rwx...
    • p选项 自动创建多层目录
  • rmdir -[p] dir_name 删除空目录
    • p选项 删除多层空目录
  • 环境变量
    • PATH变量(一个对 shell 很有用的环境变量):所有的命令,都只会从该变量指定的目录查找。(不同的路径之间用「:」分隔)如果要运行不在$PATH中的程序,需要使用绝对路径或相对路径明确指定。
    • export variable: 将 自定义变量 var 导入到环境变量(仅当前环境有效,JAVA_HOME 之类的变量就需要使用它来导入)
    • env 查看当前环境变量
    • set /unset 设定自用变量

文档与目录

  • cp -[aipr] source destination (不同身份的用户,执行这条指令,结果会有明显的差别)
    • a选项 递归复制所有文件、对link文件复制其本身(不加a的话,默认是复制源文件的,而不是该link文件)
    • i选项 交互模式,执行不可逆操作(覆盖)时,先行提示
    • p选项 同时复制该文件的所有属性(权限、所有者、时间)
    • r选项 递归复制,用于目录复制
    • u选项 在目标文档与源文档有差异时才复制,常用于备份。
    • cp file1 file2 directory 复制多个文件到一个目录
  • rm -[fir] file_or_dir
    • f 强制删除,忽略不存在的档案,没有任何提示
    • i 交互模式
    • r 递归移除(rmdir的加强版,危险操作)
  • mv -[fiu] source destination
    • f 强制移动,直接覆盖已有文档,无提示
    • i 交互模式
    • u 更新模式update,只当 source 比目标文档更新时才覆盖。
    • 可一次移动多个文件到某目录
    • 也用于目录或文档的更名
  • touch 新建空文档/更新已存在文档的时间
  • ln 新建链接

文档内容查阅

  • cat -n 正序查阅(n表示带行号)
  • tac 倒叙(cat的反写)
  • nl 显示行号
  • more 一页页查阅
  • less 滚动查阅,前后都可滚动、还有几个跳转查找指令可用
  • head [-n num] file 查看前num行,默认10
  • tail 查看最后num行,用法同上
  • hd 查看binary文档,默认16进制
  • file 查询指定文件/目录的属性,text or directory, text or binary, excutable or not, etc. (deepin 默认没有安装,需要sudo apt-get install file

账号管理

  • /etc /passwd
  • 账号变更: useradd, passwd, chage, usermod, userdel
  • 群组变更: groupadd, groupmod,  groupdel, gpasswd
  • id,  finger,   chfn(change finger),   chsh (changer shell)
  • sudo(super do),   su
  • ACL
  • lastlog,     who

文档与目录的权限管理

  • r:read w:write x:execute
    • 文档
      • 文档的 rwx 控制文档的可读写/执行,但不包括增删。
    • 目录的 rwx
      • r 表示可查看目录内的结构(至于目录内的内容是否可读,就是它自己的rwx的事了)
      • w表示可增删这个目录内的结构
      • x 表示能以该目录为当前工作目录(可 cd 到该目录)
  • chmod 755 file.sh
    • 仅拥有者可写,其他人可读可执行。(创建 shell 脚本时常用 r w x : 4 2 1)
    • 另一种方法是使用 u g o,可读性更好,但是书写会麻烦一点点。
    • 第三种方法是使用 a 和 +-= 来设定
  • chown ryan:ryan filename
    • 修改文件拥有者、群组。不同用户之间交换文件时常用。(例如root要发一个文件给普通用户)
  • chgrp 仅修改群组时使用
  • umask 档案预设需要减掉的(掩码)权限(未理解)
  • chattr [+-=][ai] file 设置隐藏属性,常用于安全相关的设置
    • a 只能增加内容,不能被删除、修改
    • i 不可变对象,不能被删除、修改、改名、创建链接、增加内容。
  • lsattr 显示隐藏属性

重定向、管道

  1. 输出重定向(可使用数字做为前缀,1为stdin,2为stderr)
    1. > 覆盖方式的流重定向,将标准输出输出为某文档
    2. >> 添加方式的重定向,将内容添加到某文档尾部
  2. 输入重定向
    1. < 以某文档作为程序的标准输入,覆盖方式。
    2. << 添加方式的输入重定向

Linux 的目录结构(仅较重要的部分)

  1. /usr (unix software resources) 主要的系统软件
    • usr/bin 一般用户能够使用的命令,基本都在这里
    • usr/sbin 即 super binaries,与系统管理相关的,需要root权限的指令会存放在这里。(类似于 win 的 C://Windows)
    • usr/local 管理员额外安装的系统软件,应安装在此。(类似于 win 的 C://Programm Files)
    • usr/share 基本都是只读文档,man doc 都在这
    • usr/include c/c++的头文件
    • usr/src 系统软件的源代码,可放置于此。
    • usr/local/src 管理员额外安装的软件的源码
  2. /opt 即 optional softwares (类似于 win 的 D://Programm Files)
  3. /var variable,可变目录,随着使用增大。
    • var/cache 缓存
    • var/lock 资源锁
    • var/log 日志文件
日 志 文 件 说 明
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/maillog 与邮件相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
  1. /etc 配置文件,建议备份 (名字来自于 etcetera,原用于存放 “其他文件”,演化至今,便成了配置文件夹。)
    • 全局环境
      • /etc/profile 系统的 shell 环境配置文件(仅每个用户登录时加载一次,不建议修改)
      • /etc/bash.bashrc 系统的 bash shell 环境配置文件(每次开启一个新 bash,都会加载。如果需要对所有用户都生效的 bash 环境,就修改这个)
    • 用户环境
      • ~/.profile [也可能是 ~/.bash_profile] 用户个人的 shell 环境配置文件,相当于 /etc/profile 的个人 patch。一般来说它设定一些用户个人的环境变量,然后执行 ~/.bashrc。
      • ~/.bashrc 用户个人的 bash shell 配置文件(同样每次开新 bash 都会加载)
    • source :在当前 shell 中执行指定的 shell 脚本。常用于环境设定档。(这样做,运行后的变量会存在于当前shell,也就完成了所谓的环境设定。而如果是普通的直接运行的话,会启用新shell来运行该脚本,运行结束环境就销毁了。)

由上述配置文件引申,用户安装二进制 tarball 时,通常有两种做法

  1. 一种就是将该软体的 bin 目录添加进PATH中(这会使该 bin 目录中的所有可执行文件都被加入到 PATH,如果你不想这样,请考虑第二种方法),也就是将相关命令写入 shell 配置文件中。至于应该添加到哪里,看了上面的说明,你应该已经懂了。

    举例来说,安装一个软件时,如果该软件大家都要用,就应该写入系统配置里,然后如果你基本只用 bash,写 bashrc 里更方便(修改可立即生效),否则选profile。

    而若只有你个人需要该软件,肯定要放用户配置里,再考虑你是不是用其他 shell。一般来说放 bashrc 里总没问题,而放 profile 里,有时会需要手动 source /etc/profile 一下才能用。

  2. 第二种呢,就是向PATH默认就会包含的那些目录中(例如 /usr/local/bin),添加启动脚本。(使用 python 或 shell 编写)Jetbrains 家的软件在检测到该软件的 bin 目录未添加进 PATH 时,就会提示你这么干。(idea 会向 /usr/local/bin 添加名为 idea 的 python 启动脚本)

bash 的特殊符号表

符号 内容
# 注解符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\ 跳脱符号:将『特殊字符或通配符』还原成一般字符
| 管线 (pipe):分隔两个管线命令的界定(后两节介绍);
; 连续指令下达分隔符号:连续性命令的界定 (注意!与管线命令并不相同)
~ 用户的家目录
$ 取用变量前置字符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将指令变成后台工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔的符号
>, >> 数据流重导向:输出导向,分别是『取代』与『累加』
<, << 数据流重导向:输入导向 (这两个留待下节介绍)
' ' 单引号,不具有变量置换的功能 ($ 变为纯文本)
" " 具有变量置换的功能! ($ 可保留相关功能)
` ` 两个『 ` 』中间为可以先运行的指令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合!

系统监控常用命令:

  1. htop — 系统进程监控(需要安装,此外 linux 自带 top 命令)
  2. iotop — 磁盘IO监控,有总的IO统计,和分进程的IO统计,风格类似 top
  3. nmon — CPU/Disk IO/Network IO 多功能监控工具
  4. at(atd),   crontab(crond) —定时任务

线程管理

  1. job:  ctrl +z,  jobs, fg, bg, kill  (job 是所在bash的子任务,不一定正在运行)
  2. process: ps [aux,  axjf, -lA]
    1. top/htop,     pstree
    2. kill,    killall (整个相关程序组)

零碎

  1. default terminal:tty1/tty6    (ctrl+)alt+f[1-6]
  2. parted 分区工具
  3. alias/unalias

脱离当前的 shell,在后台工作。(简便的“服务”)

nohup python xxx.py &

上面的命令使 xxx.py 在后台运行,即使当前 shell 被关闭,该程序仍然不会被影响。而 std 被定向到运行目录下的 nohup.out 文件(默认行为)。

查看系统信息

  1. uname --all:查看 linux 内核信息
  2. cat /etc/system-releasecat /etc/os-release:查看系统的发行版信息
  3. df -h:查看系统中文件的使用情况
  4. du -sh *:查看当前目录下各个文件及目录占用空间大小
  5. 全文搜索:grep ‘string-pattern' [path-pattern] -r,在匹配到的所有文档内搜索 string-pattern
  6. 全文搜索并替换:sed -i "s/pattern_str/replace_str/g" `grep "key_pattern" 'path_pattern' -r`
  7. 文件名搜索并替换:sed -i "s/pattern_str/replace_str/g" `find . -name "pattern"`
  8. 批量转换大小写: sed -i 's@http://gitlab.xxx.*.git@\L&@g' find . -name pubspec*
    • \L 表示转换成小写,\U 表示转换成大写
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}

参考