bash 命令行学习笔记

命令行学习笔记

该文档为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)才可以无条件终止进程,其他信号进程都有权利忽略。下面是常用的信号:
  1. HUP 1 终端断线
  2. INT 2 中断(同 Ctrl + C)
  3. QUIT 3 退出(同 Ctrl + )
  4. TERM 15 终止
  5. KILL 9 强制终止
  6. CONT 18 继续(与STOP相反, fg/bg命令)
  7. 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 -lntpss -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

原文地址:https://www.cnblogs.com/mangojun/p/12866625.html