Linux 基础命令、文档树 和 bash
最近发现了一个总结得更好的: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)
- cut(从每一行中,仅取出需要的部分)
- grep -[vniwc] 'pattern' file(从所有行中,仅取出需要的行,pattern 部分使用正则表达式)
- grep --color=auto 'pattern' filename
- v 反匹配,列出不被匹配的行
- n 显示行号
- i 忽略大小写
- w 单词完全匹配
- c 计数匹配到的行
- 全文搜索:
grep ‘string-pattern' [path-pattern] -r
,在匹配到的所有文档内搜索string-pattern
- sed 按行进行的修改替换命令(行是基本单位)
- awk 针对每行的一部分进行的修改替换命令(行的一部分是基本单位)
- uniq 重复的行只列出一个
- wc 字符计数
- tee 单入口、双出口的管道,在需要检视中间流时很有用
- sort 按行排序
- 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
和/etc/group
: 账号及群组相关配置文件- 账号变更: useradd, passwd, chage, usermod, userdel
- 群组变更: groupadd, groupmod, groupdel, gpasswd
id <user>
: 查看用户的 uid, gid, 以及所有的群组。groups <group>
: 查看某群组中所有的用户。- 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为stdin,2为stderr)
>
覆盖方式的流重定向,将标准输出输出为某文档>>
添加方式的重定向,将内容添加到某文档尾部
- 输入重定向
<
以某文档作为程序的标准输入,覆盖方式。<<
添加方式的输入重定向
Linux 的目录结构(仅较重要的部分)
- /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 管理员额外安装的软件的源码
- /opt 即 optional softwares (类似于 win 的 D://Programm Files)
- /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 | 守护进程启动和停止相关的日志消息 |
- /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 时,通常有两种做法:
- 一种就是将该软体的 bin 目录添加进PATH中(这会使该 bin 目录中的所有可执行文件都被加入到 PATH,如果你不想这样,请考虑第二种方法),也就是将相关命令写入 shell 配置文件中。至于应该添加到哪里,看了上面的说明,你应该已经懂了。
举例来说,安装一个软件时,如果该软件大家都要用,就应该写入系统配置里,然后如果你基本只用 bash,写 bashrc 里更方便(修改可立即生效),否则选profile。
而若只有你个人需要该软件,肯定要放用户配置里,再考虑你是不是用其他 shell。一般来说放 bashrc 里总没问题,而放 profile 里,有时会需要手动source /etc/profile
一下才能用。 - 第二种呢,就是向PATH默认就会包含的那些目录中(例如 /usr/local/bin),添加启动脚本。(使用 python 或 shell 编写)Jetbrains 家的软件在检测到该软件的 bin 目录未添加进 PATH 时,就会提示你这么干。(idea 会向 /usr/local/bin 添加名为 idea 的 python 启动脚本)
bash 的特殊符号表
符号 | 内容 |
# | 注解符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 |
\ | 跳脱符号:将『特殊字符或通配符』还原成一般字符 |
| | 管线 (pipe):分隔两个管线命令的界定(后两节介绍); |
; | 连续指令下达分隔符号:连续性命令的界定 (注意!与管线命令并不相同) |
~ | 用户的家目录 |
$ | 取用变量前置字符:亦即是变量之前需要加的变量取代值 |
& | 工作控制 (job control):将指令变成后台工作 |
! | 逻辑运算意义上的『非』 not 的意思! |
/ | 目录符号:路径分隔的符号 |
>, >> | 数据流重导向:输出导向,分别是『取代』与『累加』 |
<, << | 数据流重导向:输入导向 (这两个留待下节介绍) |
' ' | 单引号,不具有变量置换的功能 ($ 变为纯文本) |
" " | 具有变量置换的功能! ($ 可保留相关功能) |
` ` | 两个『 ` 』中间为可以先运行的指令,亦可使用 $( ) |
( ) | 在中间为子 shell 的起始与结束 |
{ } | 在中间为命令区块的组合! |
系统监控常用命令:
- htop — 系统进程监控(需要安装,此外 linux 自带 top 命令)
- iotop — 磁盘IO监控,有总的IO统计,和分进程的IO统计,风格类似 top
- nmon — CPU/Disk IO/Network IO 多功能监控工具
- at(atd), crontab(crond) —定时任务
线程管理
- job: ctrl +z, jobs, fg, bg, kill (job 是所在bash的子任务,不一定正在运行)
- process: ps [aux, axjf, -lA]
- top/htop, pstree
- kill, killall (整个相关程序组)
零碎
- default terminal:tty1/tty6 (ctrl+)alt+f[1-6]
- parted 分区工具
- alias/unalias
脱离当前的 shell,在后台工作。(简便的“服务”)
nohup python xxx.py &
上面的命令使 xxx.py
在后台运行,即使当前 shell 被关闭,该程序仍然不会被影响。而 std 被定向到运行目录下的 nohup.out
文件(默认行为)。
查看系统信息
uname --all
:查看 linux 内核信息cat /etc/system-release
和cat /etc/os-release
:查看系统的发行版信息- df -h:查看系统中文件的使用情况
- du -sh *:查看当前目录下各个文件及目录占用空间大小
- 全文搜索:
grep ‘string-pattern' [path-pattern] -r
,在匹配到的所有文档内搜索string-pattern
- 全文搜索并替换:sed -i "s/pattern_str/replace_str/g" `grep "key_pattern" 'path_pattern' -r`
- 文件名搜索并替换:sed -i "s/pattern_str/replace_str/g" `find . -name "pattern"`
- 批量转换大小写: sed -i 's@http://gitlab.xxx.*.git@\L&@g'
find . -name pubspec*
\L
表示转换成小写,\U
表示转换成大写
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}