命令行学习笔记
该文档为linux bash 命令行学习的笔记摘要,用于记录基本的命令行操作,以及技巧,参考学习链接如下
https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md
一、基础
1.文本编辑器emacs操作笔记
详见emacs 内置教程
2.输出输入重定向以及管道命令、标准输入标准输出标准错误
- 标准输入(stdin) -0 、标准输出(stdout)-1 、标准错误(stderr)-2
- 标准输入重定向
cat < in.txt
- 标准输出重定向 覆盖模式:> 追加模式:>>
- 将标准输出重定向到特定文件
echo "123" > out.txt
- 将标准错误重定向到特定文件
cmd 2>error.txt
- 将标准输出和标准错误定向到不同文件
cmd 1>out.txt 2>err.txt
- 将标准输出和标准错误重定向到同一个文件
cmd >out_err.txt 2>&1
- /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果,如
$ command > /dev/null 2>&1
3.bash的任务管理工具: &,ctrl-z,ctrl-c,jobs,fg,bg,kill
- & 表示把任务放在后台运行 python test.py > log.txt & 运行test.py程序,并置于后台运行,日志信息重定向到log.txt
- ctrl+c 是强制中断程序的执行。
- ctrl+z 的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态。
- fg 重新启动被前台中断的任务,把后台的命令调至前台继续运行 fg %job_num
- bg 将后台中断的进程继续运行
- jobs 查看当前有多少在后台运行的命令
- kill 杀掉进程,只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。下面是常用的信号:
- HUP 1 终端断线
- INT 2 中断(同 Ctrl + C)
- QUIT 3 退出(同 Ctrl + )
- TERM 15 终止
- KILL 9 强制终止
- CONT 18 继续(与STOP相反, fg/bg命令)
- STOP 19 暂停(同 Ctrl + Z)
- pgrep 和 pkill 根据名字查找进程或发送信号
4.利用ssh进行远程登录
密码登录 ssh -p port username@webserverip
密钥登录 ssh -i ~/.ssh/id_rsa_1 username@webserverip
利用ssh-keygen 生成密钥对,公密: ../.ssh/id_rsa.pub 私密:../.ssh/id_rsa 将公密放到服务器
ssh 配置文件 etc/ssh/sshd_config 设置端口,设置是否允许密码登录、是否需要进行密钥验证等
Port 32200
RSAAuthentication yes
PubkeyAuthentication yes
5.基本的文件管理工具使用
less、 head、tail、 tail -f、 ln 和 ln -s 、chown、 chmod、 du 、df 、fdisk 、mkfs、 lsblk ,inode
ln 硬连接
ln -s 软连接
6.基本的网络管理工具 ifconfig
ifconfig 查看网络内容,启动或者关掉网卡,修改网络ip,修改mac地址功能
7.版本控制工具git
8.熟悉正则表达式,使用grep,学习参数 -i,-o -v -A -B -C
grep 命令用于查找文件里符合条件的字符串,参数如下:
- -i 忽略大小写
- -o 只显示匹配的内容
- -v 不匹配符合的内容
- -A 除了显示匹配的内容之外,还显示该行之前的n行
- -B 除了显示匹配的内容之外,还显示该行之后的n行
- -C 除了显示匹配的内容之外,还显示改行前后的n行
二、日常使用
1.bash命令操作快捷键
- ctrl-w 删除你键入的最后一个单词
- ctrl-u 可以删除行内光标所在位置之前的内容
- alt-b 和 alt-f 可以以单词为单位移动光标
- ctrl-a 可以将光标移至行首
- ctrl-e 可以将光标移至行尾
- ctrl-k 可以删除光标至行尾的所有内容
- ctrl-l 可以清屏
2.历史记录
键入 history 查看命令行历史记录
- !n(n 是命令编号)就可以再次执行
- !$ 它用于指代上次键入的参数
- !! 可以指代上次键入的命令
- alt-. 循环地移向前显示历史记录
- ctrl+r进行历史命令搜索,重复按会向下继续匹配 ,按入enter会执行当前匹配的历史命令
3.目录操作
- cd 进行目录切换工作
- cd ~ 进行家目录
- cd - 返回前一个工作目录
- cd .. 返回上一个工作目录
4.xargs命令
5.查看进程监听的端口
使用 netstat -lntp
或ss -plat
检查哪些进程在监听端口(默认是检查 TCP 端口; 添加参数 -u 则检查 UDP 端口)
或者 lsof -iTCP -sTCP:LISTEN -P -n
netstst部分参数
- -t (tcp) 仅显示tcp相关选项
- -u (udp) 仅显示udp相关选项
- -n 拒绝显示别名,能显示数字的全部转化为数字
- -l 仅列出在Listen(监听)的服务状态
- -p 显示建立相关链接的程序名
查看结果如下:
# netstst -lntp | grep 32200
tcp 0 0 0.0.0.0:32200 0.0.0.0:* LISTEN 492/sshd
6.查看开启的套接字和文件
lsof(list open files)是一个列出当前系统打开文件的工具。
lsof 输出各列信息含义:
字段 | 含义 |
---|---|
COMMAND | 进程名称 |
PID | 进程标识符 |
USER | 进程所有者 |
FD | 文件描述符 |
TYPE | 文件类型 |
DEVICE | 指定磁盘名称 |
SIZE | 文件大小 |
NODE | 索引节点(文件在磁盘的标识) |
NAME | 打开文件的确切名称 |
部分lsof命令:
lsof -i:8080 #查看8080端口占用
lsof abc.txt #显示开启文件abc.txt的进程
lsof -c abc #显示abc进程现在打开的文件
lsof -c -p 1234 #列出进程号为1234的进程所打开的文件
lsof -g gid #显示归属gid的进程情况
lsof +d /usr/local/ #显示目录下被进程开启的文件
lsof +D /usr/local/ #同上,但是会搜索目录下的目录,时间较长
lsof -d 4 #显示使用fd为4的进程
lsof -i -U #显示所有打开的端口和UNIX domain文件
7.可以把别名、shell 选项和常用函数保存在 ~/.bashrc,这样做的话你就可以在所有 shell 会话中使用你的设定,把环境变量的设定以及登陆时要执行的命令保存在 ~/.bash_profile。而对于从图形界面启动的 shell 和 cron 启动的 shell,则需要单独配置文件。
8.在 Bash 脚本中,子 shell(使用括号 (...))是一种组织参数的便捷方式。一个常见的例子是临时地移动工作路径,代码如下:
# do something in current dir
(cd /some/other/dir && other-command)
# continue in original dir
9.使用括号扩展({...})来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用
mv foo.{txt,pdf} some-dir #同时移动两个文件
cp somefile{,.bak} #会被扩展成 cp somefile somefile.bak#
mkdir -p test-{a,b,c}/subtest-{1,2,3} #会被扩展成所有可能的组合,并创建一个目录树
10.使用 man ascii 查看具有十六进制和十进制值的ASCII表。man unicode,man utf-8,以及 man latin1 了解通用的编码信息。
11.将 web 服务器上当前目录下所有的文件(以及子目录)暴露给你所处网络的所有用户
python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)
python -m http.server 7777 (使用端口 7777 和 Python 3)
三、文件以及数据处理
1.文件查找
在当前路径下查找 find . -name '*something*'
在所有路径下通过文件名查找文件,使用locate something
`
2.使用 sort 和 uniq,uniq 的 -u 参数和 -d 参数
sort命令用于将文本文件内容加以排序。
- -b 忽略每行前面开始出的空格字符。
- -c 检查文件是否已经按照顺序排序。
- -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
- -f 排序时,将小写字母视为大写字母。
- -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
- -m 将几个排序好的文件进行合并。
- -M 将前面3个字母依照月份的缩写进行排序。
- -n 依照数值的大小排序。
- -u 意味着是唯一的(unique),输出的结果是去完重了的。
- -o<输出文件> 将排序后的结果存入指定的文件。
- -r 以相反的顺序来排序。
- -t<分隔字符> 指定排序时所用的栏位分隔字符。
- +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
- --help 显示帮助。
- --version 显示版本信息。
uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
- -c或--count 在每列旁边显示该行重复出现的次数。
- -d或--repeated 仅显示重复出现的行列。
- -f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
- -s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
- -u或--unique 仅显示出一次的行列。
- -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
- --help 显示帮助。
- --version 显示版本信息。
- [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
- [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)
当重复的行并不相邻时,uniq 命令是不起作用的,所以uniq命令往往和sort命令一起使用
3.使用 cut,paste 和 join 来更改文件
4.运用 wc 去计算新行数(-l),字符数(-m),单词数(-w)以及字节数(-c)
wc命令用于计算字数,利用wc指令我们可以计算文件的Byte数、字数、或是列数,参数含义如下:
- -c或--bytes或--chars 只显示Bytes数。
- -l或--lines 只显示行数。
- -w或--words 只显示字数,单词数。
- --help 在线帮助。
- --version 显示版本信息
5.使用 tee 将标准输入复制到文件甚至标准输出,例如 ls -al | tee file.txt
tee命令用于读取标准输入的数据,并将其内容输出成文件
6.使用 awk 和 sed 来进行简单的数据处理
AWK是一种处理文本文件的语言,是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
基本操作语法
awk -F ':' {pattern + action}' {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令,-F 指定划分的分隔符,默认是空格
awk 内置变量
变量 | 含义 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
FS | 设置输入域分隔符,等价于命令行 -F选项 |
NF | 浏览记录的域的个数,列数 |
NR | 已读的记录数,行数 |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
变量$0表示整条记录,$1表示当前行的第一个域 $2表示当前行的第二个域 一次类推
cat /etc/passwd | awk -F ':' '{print $1}' #显示分割后的第一列
sed 命令利用脚本来处理文本文件
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e 以选项中指定的script来处理输入的文本文件。
-f 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法
7.使用 repren 来批量重命名文件,或是在多个文件中搜索替换内容。(有些时候 rename 命令也可以批量重命名,但要注意,它在不同 Linux 发行版中的功能并不完全一样。)
# 将文件、目录和内容全部重命名 foo -> bar:
repren --full --preserve-case --from foo --to bar .
# 还原所有备份文件 whatever.bak -> whatever:
repren --renames --from '(.*).bak' --to '1' *.bak
# 用 rename 实现上述功能(若可用):
rename 's/.bak$//' *.bak
8.shuf 可以以行为单位来打乱文件的内容或从一个文件中随机选取多行
9.对于二进制文件,使用 hd,hexdump 或者 xxd 使其以十六进制显示,使用 bvi,hexedit 或者 biew 来进行二进制编辑。
10.拆分文件可以使用 split(按大小拆分)和 csplit(按模式拆分)
11.使用 getfacl 和 setfacl 以保存和恢复文件权限。
例如:
getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt
四、系统调试
1.获取 CPU 和硬盘的使用状态,通常使用使用 top(htop 更佳),iostat 和 iotop。而 iostat -mxz 15 可以让你获悉 CPU 和每个硬盘分区的基本信息和性能表现。
2.若要了解内存状态,运行并理解 free 和 vmstat 的输出。值得留意的是“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,而与空闲内存无关。
3.查看你当前使用的系统,使用 uname,uname -a(Unix/kernel 信息)或者 lsb_release -a(Linux 发行版信息)。
4.如果你删除了一个文件,但通过 du 发现没有释放预期的磁盘空间,请检查文件是否被进程占用: lsof | grep deleted | grep "filename-of-my-big-file"
五、单行脚本
1.当你需要对文本文件做集合交、并、差运算时,sort 和 uniq 会是你的好帮手。此处假设 a 与 b 是两内容不同的文件。这种方式效率很高,并且在小文件和上 G 的文件上都能运用(注意尽管在 /tmp 在一个小的根分区上时你可能需要 -T 参数,但是实际上 sort 并不被内存大小约束),参阅前文中关于 LC_ALL 和 sort 的 -u 参数的部分。
sort a b | uniq > c # c 是 a 并 b
sort a b | uniq -d > c # c 是 a 交 b
sort a b b | uniq -u > c # c 是 a - b
2.使用 grep . (每行都会附上文件名)或者 head -100 (每个文件有一个标题)来阅读检查目录下所有文件的内容。这在检查一个充满配置文件的目录(如 /sys、/proc、/etc)时特别好用
$ ls hosts out.txt| head -100 *
==> hosts <==
192.168.15.1
192.168.15.1
awdd
my name is mike hello
i am a teacher
what a stupid gay,fuck!
==> out.txt <==
out.txt
hosts
3.要持续监测文件改动,可以使用 watch,例如检查某个文件夹中文件的改变,可以用 watch -d -n 2 'ls -rtlh | tail';或者在排查 WiFi 设置故障时要监测网络设置的更改,可以用 watch -d -n 2 ifconfig。
4.如果你想在文件树上查看大小/日期,这可能看起来像递归版的 ls -l 但比 ls -lR 更易于理解:
find . -type f -ls
5.计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍)
awk '{ x += $3 } END { print x }' myfile