Linux背景
- 内核版
- 发行版
系统操作
通配符:shell内建的符号
*
匹配任何字符?
匹配一个字符[xyz]
匹配任意一个字符[a-z]
匹配范围[!xyz]
或[^xyz]
不匹配
多模式文本编辑器
- 正常模式
- 插入模式
- 命令模式
- 可视模式
用户和用户组管理
useradd/userdel/passwd/usermod
用户组:把用户添加到某个用户组,便于批量管理用户
id:查看用户信息
su:切换用户,加上-
表示同时切换用户环境
sudo:以其他用户身份执行命令
visudo:配置哪些用户或者用户组可以执行哪些系统命令
用户和用户组配置文件
/etc/passwd:用户配置
用户名:是否密码登录:uid:gid::目录:shell/etc/shadow:保存用户密码
/etc/group:用户组相关
服务管理
shell脚本
文本操作
常用服务搭建
开发和调试
- pstack
- strace
- readelf
- objdump
- ldd
- pmap
- ar:解压静态库
- taskset:绑核命令
文件处理
网络工具
网络状态查看
net-tools/iproute
网络配置
路由命令
网络故障排除
网络服务管理
常用网络配置文件
- ifconfig
- netstat:查看端口
- ping
- traceroute
- route
- tcpdump
- curl
- nc
- dig
- iptables
性能分析
其它
列表
cloc
cloc --exclude-dir=<D1>[,D2,]
# --exclude-dir:跳过某些文件
perror
perror xxx
netstat
netstat -anp | grep PORT
# 查看端口
man
man man
# 1 Executable programs or shell commands
# 2 System calls (functions provided by the kernel)
# 3 Library calls (functions within program libraries)
# 4 Special files (usually found in /dev)
# 5 File formats and conventions eg /etc/passwd
# 6 Games
# 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
# 8 System administration commands (usually only for root)
# 9 Kernel routines [Non standard]
ar
ar x XXX.a
# 解压静态库
cmp
cmp FILE1 FILE2
# 比较二进制文件
diff
diff -r DIRECTORY1 DIRECTORY2
diff FILE1 FILE2
# 比较目录和文本文件
grep
文本过滤器,用来找出文件中的匹配文本
grep [OPTIONS] PATTERN [FILE]
参数 | 描述 |
---|---|
-c | 计算找到PATTERN的次数 |
-i | 忽略大小写 |
-n | 输出行号 |
-v | 反向选择,打印不匹配的行 |
-r | 递归搜索 |
-E | 支持扩展正则表达式 |
-F | 不按正则表达式匹配,按文本字面意思匹配 |
-w | 匹配整词 |
-x | 匹配整行 |
# 找出/etc/passwd文件中出现root的行
grep "root" /etc/passwd
# 找出/etc/passwd文件中没有出现root和nologin的行
grep -v "root" /etc/passwd | grep -v "nologin"
# 找出/etc/passwd文件中出现root或者nologin的行
grep -E "root|nologin" /etc/passwd
awk
awk是一个文本处理工具,通常用于处理数据并生成结果报告
awk "BEGIN{}pattern{command}END{}" file
语法格式 | 含义 |
---|---|
BEGIN{} | 正式处理数据前执行 |
pattern | 匹配模式 |
{command} | 处理命令 |
END{} | 处理数据结束后执行 |
内置变量
内置变量 | 含义 |
---|---|
$0 | 当前行 |
n | 当前行的第1个到第n个字段 |
NF | 当前行的字段个数 |
NR | 当前行的行号 |
FNR | 多文件处理时,每个文件单独记录行号 |
FS | 字段分割符,默认以空格或TAB键分割 |
RS | 行分割符,默认以回车换行分割 |
OFS | 输出字段分割符 |
ORS | 输出行分割符 |
FILENAME | 当前行的文件名 |
ARGC | 命令行参数个数 |
ARGV | 命令行参数数组 |
printf
格式符 | 含义 |
---|---|
%s | 打印字符串 |
%d | 打印10进制数 |
%f | 打印浮点数 |
%x | 打印16进制数 |
%o | 打印8进制数 |
%e | 打印数字的科学计数法格式 |
修饰符 | 含义 |
---|---|
- | 左对齐 |
+ | 右对齐 |
# | 显示8进制在前面加0,显示16进制在前面加0x |
awk 'BEGIN{FS=":"} {printf "%s\n",$1}' file # 以字符串格式打印file文件的第一个字段,以":"作为分割符
模式匹配
- 正则表达式匹配
- 运算符匹配
awk 'BEGIN{FS=":"}/^root/{print $0}' file # 打印file文件中以root开头的所有行
awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' file # 以":"为分割符,打印file文件中第3个字段小于50,第4个字段大于50的所有行
awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' file # 以":"为分割符,打印file文件中第3个字段包含3个以上数字的所有行
动作表达式
awk '/^$/{sum++}END{print sum}' file # 打印file文件中空白行的数目
字符串函数
字符串函数 | 含义 |
---|---|
length(str) | 计算长度 |
index(str1, str2) | 返回在str1中查找到的str2的位置 |
tolower(str) | 转为小写 |
toupper(str) | 转为大写 |
split(str, arr, fs) | 分割字符串并保存到数组 |
match(str, RE) | 返回正则表达式匹配到的字符串的位置 |
substr(str, m, n) | 截取子串 |
sub(RE, repstr, str) | 替换查找到的第1个子串 |
gsub(RE, repstr, str) | 替换查找到的所有子串 |
awk 'BEGIN{str="abcde";pos=index(str,"c");print pos}' # 打印"c"在str的位置
awk 'BEGIN{str="abc12d";pos=match(str,/[0-9]/);print pos}' # 打印str中第1个数字出现的位置
awk 'BEGIN{str="abcde";print substr(str,1,2)}' # 打印str从第1个开始,截取2位得到的子串
awk 'BEGIN{str="abc12d";sub(/[0-9]+/,"$",str);print str}' # 打印str中数字串替换为"$"后的字符串
选项
参数 | 含义 |
---|---|
-v | 参数传递 |
-f | 指定脚本文件 |
-F | 指定分割符 |
awk -v num1=$num 'BEGIN{print num1}' # 把外部变量num传递给awk
awk -F: '{print $1}' # 以":"为分割符打印第1个字段
数组的使用
shell中数组的用法
array=("abc" "def" "ghi")
打印元素: echo ${array[0]}
打印元素个数: echo ${#array[@]}
打印元素长度: echo ${#array[0]}
给元素赋值: array[0] = "ABC"
删除元素: unset array[0]; unset array
分片访问: echo ${array[@]:1:2}
元素内容替换: ${array[@]/e/E} 只替换第1个 ${array[@]//e/E} 替换所有
遍历: for e in ${array[@]} do echo $e done
awk中数组的用法
TODO
sed
流编辑器,对文件逐行进行处理
sed [OPTIONS] "PATTERN COMMAND" [FILE]
OPTIONS
参数 | 描述 |
---|---|
-n | 只打印模式匹配行 |
-f | 编辑动作保存在文件,指定文件执行 |
-r | 支持扩展正则表达式 |
-i | 直接修改文件内容 |
PATTERN
匹配模式 | 含义 |
---|---|
10command | 匹配到第10行 |
10,20command | 匹配从第10行开始,到第20行结束 |
10,+5command | 匹配从第10行开始,到第16行结束 |
/pattern1/command | 匹配到pattern1的行 |
/pattern1/,/pattern2/command | 匹配到pattern1的行开始,到匹配到pattern2的行结束 |
10,/pattern1/command | 匹配从第10行开始,到匹配到pattern1的行结束 |
/pattern1/,10command | 匹配到pattern1的行开始,到第10行结束 |
COMMAND
操作 | 命令 | 含义 |
---|---|---|
查询 | p | 打印 |
删除 | d | 删除 |
增加 | a | 行后追加 |
增加 | i | 行前追加 |
增加 | r | 外部文件读入,行后追加 |
增加 | w | 匹配行写到外部文件 |
修改 | s/old/new | 把行内第1个old替换为new |
修改 | s/old/new/g | 把行内全部old替换为new |
修改 | s/old/new/2 | 把行内前2个old替换为new |
修改 | s/old/new/ig | 把行内全部old替换为new,忽略大小写 |
sed -n "17p" file # 打印file文件第17行
sed -n "/^root/p" file # 打印file文件以root开头的行
sed -n "/^ftp/,/^mail/p" file # 打印file文件以ftp开头的行,到以mail开头的行的全部内容
sed -i "15d" file # 删除file文件第15行
sed -i "/\/sbin\/nologin/d" file # 删除file文件匹配/sbin/nologin的行
sed -i "/^mail/,/^yarn/d" file # 删除file文件以mail开头的行,到以yarn开头的行的全部内容
sed -i "/[:blank:]*#/d;/^$/d" file # 删除file文件中所有的注释行和空行
sed -i "1s/root/ROOT/" file # 修改file文件第1行第1个root为ROOT
sed -i "5,10s/root/ROOT/g" file # 修改file文件第5行到第10行所有的root为ROOT
sed -i "/^root/,/mail/s/login/LOGIN/g" file # 修改file文件以root开头的行到匹配mail的行中所有的login为LOGIN
sed -i "10a Add Line Behind" file # file文件第10行后面添加Add Line Behind
sed -i "10,20i Add Line Before" file # file文件第10行到第20行每行前面添加Add Line Before
sed -i "20r /etc/fstab" file # 把/etc/fstab文件内容追加到file文件第20行后面
sed -i "/\/bin\/bash/w /tmp/sed.txt" file # 把file文件匹配/bin/bash的行追加到/tmp/sed.txt文件
反向引用
&
和\1
:引用模式匹配到的整个串,其中&
只能引用到匹配的完整字符串,而\1
可以使用()
引用匹配的部分字符串
sed "s/l..e/&r/g" file # 在file文件匹配l..e的所有字符串后面添加r
sed "s/\(l..e\)/\1r/g" file # 在file文件匹配l..e的所有字符串后面添加r
sed "s/l\(..e\)/L\1/g" file # 把file文件匹配l..e的所有字符串的第1个l修改为L
如果匹配模式存在变量,建议使用双引号
sed中需要引用自定义变量时,如果外面使用单引号,则自定义变量必须使用单引号
sed -i 's/'$old_str'/'$new_str'/g' file
top
load average:系统负载,即任务队列的平均长度,三个数值分别为1分钟、5分钟、15分钟前到现在的平均值
ps
# To see every process on the system using BSD syntax
ps -aux
# To see every process on the system using standard syntax
ps -ef
# To get info about threads
ps -eLf
# 显示root用户进程信息
ps -u root
ps -aux
USER:用户名
PID:进程ID
%CPU:进程的cpu占用率
%MEM:进程的内存占用率
VSZ: 进程所使用的虚存的大小
RSS:进程使用的驻留集大小或者是实际内存的大小,Kbytes字节
TTY:与进程关联的终端
STAT:进程的状态
TIME:进程使用的总cpu时间
COMMAND:正在执行的命令行命令
进程状态
D:不可被唤醒的睡眠状态,通常用于IO
R:该进程正在运行或者准备就绪(位于就绪队列)
S:该进程处于睡眠状态,可被唤醒
T:stopped by job control signal
t: stopped by debugger during the tracing
X:死掉的进程(应该不会出现)
Z:僵尸进程,进程已经中止,但是部分资源还在内存当中
<:高优先级(以下状态在BSD格式中出现)
N:低优先级
L:被锁入内存
s:is a session leader
l:多线程
+:位于后台
ps -o majflt,minflt -C XXX
# 查看进程发生缺页中断的次数
# 需要读取磁盘的是majflt,不需要读取磁盘的是minflt
kill
kill PID
# 等价于kill -15 12345,15代表编号15的SIGTERM信号
# 程序收到SIGTERM信号后,会先释放自己的资源,然后再停止,也可能被阻塞,不立即处理
kill -9 PID
# 9代表编号为9的SIGINT信号,立即杀死
ln
ln TARGET LINK_NAME # 硬链接
ln -s TARGET LINK_NAME # 软链接
tail
tail -f LOG
# -f:当文件有新写入数据时会及时更新,常用于查看日志
chmod
chmod u+r FILE
# u+r:文件所有者在原有权限基础上增加读权限
# u,g,o和r,w,x
补充
Linux文件分类
- 普通文件:第一个属性为[-]
- 目录文件:第一个属性为[d]
- 块设备文件:第一个属性为[b]
- 字符设备文件:第一个属性为[c]
- 管道文件:第一个属性为[p]
- 套接字文件:第一个属性为[s]
- 链接文件:第一个属性为[l]
设置静态IP
vim /etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.1.142
gateway 192.168.1.1
netmask 255.255.255.0
dns-nameservers 8.8.8.8
重定向
- 0是一个文件描述符,表示标准输入(stdin)
- 1是一个文件描述符,表示标准输出(stdout)
- 2是一个文件描述符,表示标准错误(stderr)
标准输出重定向到文件
1>
标准错误重定向到文件
2>
标准输出和错误重定向到同一文件
> ... 2>&1 或者 &>
标准输出和错误重定向到不同文件
1> ... 2> ...
获取Linux相关版本信息
cat /proc/version
查看静态库版本
strings -a xxx.a | grep GCC
查看进程资源限制
cat /proc/self/limits
ulimit -a
批量修改
sed -i "s/nonCopyable/NonCopyable/g" `grep nonCopyable -rl .`