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:绑核命令

文件处理

  • find:文件查找
  • sort:文件排序
  • tr:替换
  • grep
  • sed
  • awk
  • wc:统计文件内容信息
  • cut
  • paste

网络工具

网络状态查看

net-tools/iproute

网络配置

路由命令

网络故障排除

网络服务管理

常用网络配置文件

  • ifconfig
  • netstat:查看端口
  • ping
  • traceroute
  • route
  • tcpdump
  • curl
  • nc
  • dig
  • iptables

性能分析

  • ps:进程查询
  • top:资源监控
  • free
  • lsof
  • sar

其它

  • man

  • kill:杀死进程

  • chmod:修改文件权限

  • ln:链接

  • tail:查看文件尾

  • cloc:代码统计

  • perror:查看错误码

  • diff:比较目录和文本文件

  • cmp:比较二进制文件

列表

cloc

  1. cloc --exclude-dir=<D1>[,D2,]
  2. # --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 当前行
Linux命令操作 - 图1n 当前行的第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

Linux命令操作 - 图2

load average:系统负载,即任务队列的平均长度,三个数值分别为1分钟、5分钟、15分钟前到现在的平均值

Linux—top命令

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 .`