Linux 基础知识

关于

作为一个合格的工程师,怎能不懂Linux,所以学习记录一些知识点。

常用命令集合

文件系统相关

some-cmd 1>stdout.txt 2>stderr.txt

权限相关

操作系统相关

后台可靠运行的几种方法:
- 后台运行加一个&即可,例如sleep 100 &,只能一直保持会话,如果shell会话关了,这个子进程也会关掉。
- nohup 方式:
我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
- setsid 方式:
nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。
使用的时候,也只需在要处理的命令前加上 setsid 即可。
- 当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。

subshell 示例
[root@pvcent107 ~]# (ping www.ibm.com &)
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com
root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
[root@pvcent107 ~]#

从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。
- 如果已经提交了任务,但是没加nohup或者setsid,怎么补救?可以用 disown 命令来补救。
- disown -h jobspec 是某个作业忽略HUP信号
- disown -ah 是所有作业忽略HUP信号
- disown -rh 是正在运行的作业忽略HUP信号
- 更多技巧,参考IBM文档
1. IBM文档 https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

字符串工具

## 从log.txt中查找keyword出现的行
grep keyword log.txt
## 查询多个模式
grep -E 'keyword|otherword' log.txt
grep -e keyword -e otherword log.txt

grep -E 扩展了默认的正则式,可以使用一下特性:

sort 命令

将文件的每一行作为一个单位,进行排序,从首字符开始,按照ASCII码进行比较(默认情况)。
- u 参数,去重
- r 参数,降序
- o 参数,排序后写入原文件,重定向会将文件内容清空,达不到要求,可以用这个参数
- n 参数,表示不按照ASCII码排序,而是按照数值大小
- t 参数 和 k 参数,用来排序csv格式,t 指明分隔符 k 指明排序的列序号
- f 参数,忽略大小写
- c 参数,检查是否排好序,输出第一个乱序行信息,返回1;C参数,也是检查,但不输出乱序行信息
- M 参数,以月份排序,会识别月份(只对英文吧)
- b 参数,忽略每一行前面所有空白

watch 命令

用来周期性地执行某个程序,全屏显示执行结果。常用来 tail log-file,是的,我就是要干这个事情才搜到这个命令的。

常用参数:

最后接你要周期执行的命令即可。

例子

# 监控log
watch -n 1 -d tail log-file

# 显示网络连接变化
watch -n 1 -d netstat -ant

# 每秒高亮显示http连接数变化
watch -n 1 -d 'pstree|grep http'

wc 命令

用来统计文件的文本行数、单词数、字节数等。

参数:-c, --bytes
打印字节数(print the byte counts)

参数:-m, --chars
打印字符数(print the character counts)

参数:-l, --lines
打印行数(print the newline counts)

参数:-L, --max-line-length
打印最长行的长度(print the length of the longest line)

参数:-w, --words
打印单词数(print the word counts)

tar 打包命令

常用参数 -v 显示处理过程。-c 创建, -f 指定文件, -r 追加, -x解压, -z gzip压缩。

常用组合有:

网络命令

VIM

三种模式

移动光标

在编辑模式下操作。

编辑命令

插入模式

命令模式

编辑模式下按:号,进入命令模式,输入命令后回车即可运行命令。
- 文件命令
- :e path-to-file 打开文件
- :w 保存当前文件
- :w path-to-file 另存为
- :q 退出,强制版:q!
- :wq 保存并退出
- :f filename 重命名文件
- :r filename 读取filename到光标后面
- 行号与文件
- :12 移动到第12行
- :12w filename 第12行写入到文件
- :12,32w filename 将第12-32行写入到文件,这里可以用$表示最后一行,用.表示当前行,还可以用.+5表示当前行后的第5行
- 命令模式下的搜索
- :/str/正向搜索str
- :?str?反向搜索str
- :/str/w file 正向搜索,并将第一个包含字符串 str 的行写入 file 文件
- :/str1/,/str2/w file 正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写
- 搜索正则表达式

^                放在字符串前面,匹配行首的字;
$                放在字符串后面,匹配行尾的字;
\<               匹配一个字的字头;
\>               匹配一个字的字尾;
.                匹配任何单个正文字符;
[str]            匹配 str 中的任何单个字符;
[^str]           匹配任何不在 str 中的单个字符;
[a-b]            匹配 a 到 b 之间的任一字符;
*                匹配前一个字符的 0 次或多次出现;
\                转义后面的字符。

统计出现次数命令::%s/str1/&/gn

autoindent        设置该选项,则正文自动缩进
ignorecase        设置该选项,则忽略规则表达式中大小写字母的区别
number            设置该选项,则显示正文行号
ruler             设置该选项,则在屏幕底部显示光标所在行、列的位置
tabstop           设置按 Tab 键跳过的空格数。例如 :set tabstop=n,n 默认值为 8
mk                将选项保存在当前目录的 .exrc 文件中

外部工具集成

参考

  1. http://www.jianshu.com/p/bcbe916f97e1