1. linux入门
1.1 实用程序
man
:查询联机手册1 2
man (section) name # section:1命令,2系统调用,3库函数,5配置文件(因为可能有同名的) man -k regexp # 用正则匹配
date
:获取时间和日期1
date "+%Y-%m-%d %H:%M:%S Day %j" # 格式控制字符串必须以+号开头
bc
:计算器1
bc -l # 类似于ipython的交互式界面
重定向
1 2 3
ls -l > filelist.txt # 输出重定向 sort < filelist.txt # 输入重定向 ls -l >> filelist.txt # 追加内容
管道
1
ls -l | sort # 将ls的stdout作为sort的输入
more, less
:逐屏显示(文件或输出),less可以向上翻页但是more不行1
less -Nm # fb翻页,du翻半页,gG第一/最后一行,v编辑,/?向下或上搜索字符串(nN上一个下一个)
cat
:列出文件内容;od
:逐字节打印1 2
cat -n test.txt cat > file.txt # 没有命令行参数,从stdin获取输出,直到Ctrl-D,将内容写入文件
head, tail
1 2 3
head -n 20 file.txt # 显示前20行 hand -n -20 file.txt # 除了尾部20行,其余算头并显示 tail -f file.txt # 实时打印文件尾部追加的内容
tee
:三通,将stdin输出到stdout,同时写入文件中1
ls -lh | tee out.txt
wc
-w
:字计数-l
:行计数
1 2
ps -ef | wc -l # 查看当前进程总数 ls | wc -w # 查看当前文件夹下文件个数
sort
:-r
:降序-o
:结果覆盖原文件-n
:按照数字而非字符串排序
tr str1 str2
:替换字符串,将stdin中str1的字符替换为str2的字符,然后标准输出1
cat file.txt | tr '[a-z]' '[A-Z]' # 将file.txt文件中小写字母替换为大写字母
unique
:筛选文件中重复的行
1.2 了解系统状态
who
:确定谁在系统中1 2
tty # 输出当前终端设备文件名 who am i # 输出当前终端上的登录用户
uptime
:已开机时间1
当前时间 开机时间 用户数量 CPU负载(1,5,15分钟内有几个进程在等待调度运行)
top
:列出资源占用排名靠前的进程1 2 3 4
top -d 1 -n 5 # delay=1, 运行5次 当前时间 开机时间 用户数量 CPU负载 任务(进程) PID USER PR NI VIRT进程虚拟地址空间 RES驻留内存数(占用物理内存数) SHR共享内存数 %CPU %MEM TIME+占用CPU的时间
ps
:查询进程状态,列出当前终端上启动的进程-e
:列出系统中所有进程-f
:以full格式列出-l
:以long格式列出
1
UID PID PPID C(最近几秒占用CPU情况) PRI优先级 SZ进程逻辑地址空间 WCHAN进程在何处睡眠 TTY终端名字 TIME累计占用CPU时间 CMD
free
:了解内存使用情况1
内存总量 已使用内存 空闲内存 共享内存 缓冲使用的内存 现在实际可以使用的内存
vmstat
:了解系统负载1 2
vmstat 1 -Sm # 每一秒更新一次 最关注的是cpu使用率,us=user, sy=system, id=idle, wa=wait for disk IO
2. 正则表达式
2.1 元字符
[正则表达式](https://www.runoob.com/regexp/regexp-tutorial.html)与文件名通配符规则不同
.
:匹配任意单字符*
:匹配前面单字符0次或任意多次[
:方括号内的字符为集合,表示其中任意一个,方括号内的.
*
\
表示自己,[ ][ ]
表示左右中括号的两个字符,-
表示一个区间(如果在最后则不表示区间)\
^
:在中括号内时开头表示补集,[^a-z]
表示匹配任一非小写字母(如果不在中括号内开头则不表示补集),在正则表达式开头时表示首部的限制(不在首部则不表示此限制)$
:在正则表达式尾部时表示尾部的限制(不在尾部则不表示此限制)
2.2 正则表达式拓展
()
:分组|
:逻辑或+
:匹配前面单字符1次或任意多次?
:匹配前面单字符0次或1次{m,n}
:匹配前面的单字符m到n次{m}
:匹配前面的单字符m次{m,}
:匹配前面的单字符至少m次\d
:数字,\D
:非数字,\s
:空白符(包括换行),\S
:非空白符(不包括换行),\w
:数字字母下划线(相当于 [A-Za-z0-9_])
2.3 常用命令
grep
-n 模式 文件名列表-F
:按字符串搜索(同fgrep)-G
:基本正则语法,默认-E
:拓展正则语法(同egrep)-n
:显示行号-o
:提取匹配的部分1 2
grep -n 'main' *.cpp # 从文件中筛选 ps -ef | grep -n '^zhang' # 从输入中筛选
sed
:利用正则表达式处理文本(替换、删除等)1
sed 's/^zhang/ZHANG/g' # 将开头为zhang的替换为ZHNAG,s表示替换,用/划分不同的部分,g表示如果有多个符合则全部替换
awk
:逐行扫描进行条件判断,满足条件执行动作
3. 文件编辑
3.1 vim常用操作
3.2 常见问题
vim编辑结束后Ctrl+S:Linux进入了流量控制状态,Ctrl+Q流量控制解除
Ctrl+Z导致进程挂起(进程还在但是处于Stopped状态):使用
jobs
命令查看当前Stopped的进程,使用%1
将1号作业恢复到前台运行backspace无法使用:Ctrl+H或者
stty erase ^H
Linux和Windows的文本文件存储格式不同(行尾不同),dos2unix/unix2dos转换
4. 目录管理
4.1 系统目录
- /etc:配置文件
- /tmp:临时文件
- /var:系统运行时要改变的数据(比如日志)
- /bin:系统常用命令(eg:ls、cp、cat)
- /usr/bin:常用命令(eg:ssh,ftp,make, gcc,git)
- /sbin, /usr/bin:系统管理员专用命令
- /dev:设备文件
- /usr/include:C语言头文件
- /lib, /usr/lib:C语言链接库文件,静态链接库(.a文件)和动态链接库(.so文件,共享的目标代码,多个.o文件的集成,广泛使用)
ldd
:用来查看程序运行时所需的共享库
4.2 文件通配符
command后面跟着的是参数或文件通配符,shell进行替换,而正则表达式不进行替换
- 元字符
*
:匹配任意长度的文件名字符串(包括空串),当.
作为开头或是包含/
时,必须显示匹配?
:匹配任一单字符[]
:集合,匹配其中任一字符~
:当前用户主目录.
:当前目录/
:根目录,斜线/
,反斜线\
4.3 常用命令
ls
-F
:如果是目录,名字后面带/
,如果是可执行文件,名字后面带*
,如果是链接文件,名字后面带@
,普通文件无标记(现在文件都用颜色表示)-l
:第一个字符为文件类型,-普通文件,d目录文件,l符号链接文件,c字符设备文件,b块设备文件,p管道文件
访问权限(文件所有者、同组用户、其他用户)
文件链接数
文件所有者名字和组名
文件大小(单位为字节,如果是目录则列出目录表大小不是目录大小)
最后修改日期和时间,文件名
-d
:列出目录自身的信息ls *
:递归一层列出-a
:列出所有文件
cp
:复制cp file1 file2
:将file1复制到file2(如果file2不存在则创建,如果存在则覆盖)cp -r dir1 dir2
:如果dir2不存在则复制dir1并改名为dir2,如果dir2存在则将dir1复制到dir2下cp file1 file2 dir
:将file1,file2复制到dir目录-u
:增量拷贝,便于备份目录
mv
:移动mv file1 file2
:相当于将file1改名为file2mv file1 file2 dir
:要求dir存在mv dir1 dir2
:如果dir2不存在则相当于改名,如果dir2存在移动dir1到dir2下
rm
-r递归删除, -i删除前确认, -f强迫删除只读文件
--
后参数被shell认为是处理对象而不是命令选项mkdir
和rmdir
-p
:自动创建路径中不存在的目录
touch
:将文件最后一次修改时间设置为当前时间(如果文件不存在,则创建文件)find
:遍历目录树, find 查找范围 条件 动作条件
-name wildcard
:文件名与wildcard匹配,wildcard加单引号,wildcard可以是正则表达式-regex pattern
:整个路径名与pattern匹配-type
:f普通文件,d目录,l符号链接文件,c(char),b(block),p(pipe)-size +-n
:指定文件大小(大于+,默认等于,小于-),单位是c(字符),b(块,512字节),k,M,G,默认b-mtime +-n
:文件是最近n天内修改的-newer file
:文件修改时间比file还新!
:非,前后要有空格, 默认是与\( 条件1 -o 条件2 \)
:或,因为()
是shell的特殊符号
动作
-print
:打印查找的文件路径名-exec
:对查找到的目标执行命令,在-exec之后和分号之前作为一条命令,{}表示文件路径名1 2
find . -type f -name 'utils.*' -exec ls -lh {} \; find . ! -newer file.txt \( -name '*.c' -o -name '*.h' \) -exec grep -n -- --help {} /dev/null \; # 查找早于file.txt的.c或.h文件,并且在检索到的文件(用{}表示)中查找包含--help的内容,通过grep添加两个文件({}和/dev/null)来显示查找到的内容是在哪一个文件中
-ok
:类似-exec,在执行命令前需要确认
xargs
:批量处理文件,常用于先列出文件然后再xargs批处理1 2
find . -name '*.c' -print | grep -n --help # 每找到一个文件都要创建一个进程来grep find . -name '*.c' -print | xargs grep -n --help # 找到所有文件后,只创建一个进程来批处理(grep)这些找到的文件,将标准输入追加到参数列表后面,效率高
tar
:tar c/t/x vzj f my.tar filelist
- 必选参数
c
:tar cvf my.tar filelist
将filelist中文件打包到my.tar中t
:tar tvf my.tar
查看my.tar中有什么文件x
:tar xvf my.tar
解包,此时不需要压缩算法f
:指定设备文件名(即.tar文件)
- 可选参数
v
:verbosez
:gzip压缩,快,常gz
后缀j
:bzip2压缩,压缩率高,常bz2
后缀
- 必选参数
gzip, gunzip; bzip2, bunzip2
:压缩解压缩du
:du -d 1 -h
显示文件大小,类似windows-d
:递归深度
5. 文件管理
5.1 运行时获取信息
- 配置文件
- 环境变量:
env
打印当前环境变量,PATH是可执行文件的查找路径,CLASSPATH是类库查找路径,使用export来添加环境变量 - 命令行参数
- 交互式键盘输入
5.2 文件系统
文件系统命令
mkfs
:创建文件系统mount, umount
:安装、卸载文件系统df
:查看文件系统空间空间
文件系统结构
引导块:启动系统
专用块:管理快(或超级块),存放文件系统的管理信息
i节点区:每个文件一个i-node,包括索引、指针和文件信息
文件存储区:目录表(文件名和i-node指针)和文件内容
5.3 链接
硬链接:目录项指定的“文件名 i-node”映射关系
1
ln file.txt lnk # 创建file.txt的硬链接lnk,删除lnk时对应i-node的link数减一,仅限于同一个文件系统中的普通文件
软链接(符号链接):创建一个“符号链接文件”,里面存储路径(如果时相对路径,则相对于该符号链接文件)
1
ln -s file.txt lnk # 创建file.txt的软链接lnk
5.4 可执行文件
- 程序文件:二进制
- 脚本文件:第一行指定解释程序,在运行中由解释程序创建一个进程进行解释执行
5.5 权限
- 目录权限:实际上是对目录表的权限,无读权限则无法ls,无写权限则无法创建、删除文件等(但文件可能可以修改),执行权限表示分析路径名中可以检索该目录
chmod [ugoa][+-=][rwxst] file
- u=user, g=group, o=other, a=all,
6. Shell
6.1 shell
命令解释器,交互式方式下替换、转义、内部外部命令,非交互式方式下编写脚本程序批量处理
6.2 bash启动方式
注册shell,启动时自动执行
(用户级):~/.bash_profile
(系统级):/etc/profile
退出时,自动执行
(用户级):~/.bash_logout
(系统级):/etc/bash.bash.logout
交互式shell,启动时自动执行
(用户级):~/.bashrc
(系统级):/etc/bash.bashrc
脚本解释器:
- 新创建子进程,在子进程中执行脚本
bash < test.sh
:无法携带命令行参数bash test.sh ..
:-x
参数便于调试和观察chmod u+x test.sh; ./test.sh ..
- 在当前shell中执行
chmod u+x test.sh; . test.sh ..
- 新创建子进程,在子进程中执行脚本
6.3 别名
在.bashrc中添加一个别名
|
|
6.4 重定向
输入重定向
<
:从file中获取输入<<
:从shell脚本中获取输入1 2 3 4 5 6 7 8 9
cat << WORD Now: `date` WORD # WORD是定界符,之间内容进行替换并执行获取输入 cat << 'WORD' Now: `date` WORD # 当定界符有单引号时,之间内容不做替换
<<<
:从命令行获取信息作为标准输入1
base64 <<< 'test'
输出重定向
>
:覆盖,stdout重定向>>
:追加,stdout重定向2>
:将句柄2(stderr)重定向(句柄1是stdout)2>&1
:将句柄2重定向到文件描述符1指向的文件,放在命令最后1
gcc test.c > test.err 2>&1
管道
|
将前一命令的stdout作为后一命令的stdin,同样可以使用2>&1
1
gcc test.c > test.err 2>&1 | less
6.5 设置
set -u
:当引用一个未定义的变量时,产生一个错误set +u
:当引用一个未定义的变量时,视为一个空字符串set -x
:打印出shell替换后的命令和参数,常用于观察命令经过shell替换后哪里错误set +x
:取消set -x
6.6 常用命令
echo
:打印命令行参数-e
:转义打印
printf
:类似C语言1
printf "home:%s\n" $HOME
read
:获取用户输入
6.7 环境变量
子进程继承父进程的环境变量,以后再不影响
- 使用export将局部变量转为环境变量
- PATH:命令查找路径,不要将
.
放入PATH,PATH以:
分隔路径 env
:列出环境变量set
:列出环境变量、局部变量、函数定义
6.8 替换
文件名生成替换:遵循文件通配符规则
变量替换:
$var
命令替换:以命令的stdout进行替换, `````` ````(反撇号)或者
$()
1 2
now = `date` now = $(date)
6.9 语法
6.9.1 变量
- shell先替换,再执行
- 变量都是字符串,可以修改
- 赋值语句等号两边不能有空格(否则会认为是参数),右侧字符串如果有特殊字符需要用双引号
- 引用变量:
$var
或${var}
,引用未定义变量认为是空字符串 - 内部变量:位置参数
$0, $1, $2
:第一个命令行参数(脚本文件本身的名字),第二个命令行参数,第三个命令行参数$#
:命令行参数的个数$*
:相当于"$1 $2 $3 ..."
将整体作为一个参数$@
:相当于"$1" "$2" "$3" ...
将变长的命令行参数传递给其他命令shift n
:位置参数的移位操作,位置参数顺次向前移动n个位置
6.9.2 元字符
空格,tab:命令行参数分隔符
回车:运行命令
><|
:重定向与管道(还有||
);
:一个内多个命令(还有;;
)&
:后台运行(还有&&
)$
:引用变量`````
:反撇号用于命令替换,出现元字符注意转义,可以嵌套但要转义`\\` 、
` ````1
year=`expr \`date '+%Y'\` - 10 `
文件通配符:
*[]?
()
:用于定义shell函数或在子shell中执行一组命令"
:除了$
和`````,其他的特殊字符都不转义,里面只能有四种转义:`\"` 、 `\$`、
` ````、\\
'
:都不转义,中间不能有单引号(可以拆分成多段)1 2 3 4 5
在*.conf文件中匹配'192.168.x.x'结尾 pattern: '192\.168\.[0-9.]*'$ grep \''192\.168\.[0-9.]*'\''$' *.conf # 使用单引号 grep "'192\\.168\\.[0-9.]*'\S" *.conf # 使用双引号 grep \'192\\.168\\.\[0-9.]\*\'\$ *.conf # 只使用转义,不被引号包括的字符串
6.9.3 条件判断
逻辑判断
命令的返回码是0,则命令执行成功
$?
输出上一个命令的返回码,用管道连接时以最后一个命令的返回码为准&&
||
:与,或,可以短路1 2
cmd1 && cmd2 # cmd1执行失败就不执行cmd2 cmd1 || cmd2 # cmd1执行成功就不执行cmd2
检测命令:
test
或[
(是一个命令而非词法符号,最后一个参数必须是])文件特性检测:
-f
普通文件,-d
目录文件,-r
可读,-w
可写,-x
可执行,-s
size>01 2
test -r myfile.txt && echo readable [ -r myfile.txt] && echo readable
检测命令是否执行成功
比较
字符串比较:shell中有三种字符串
str1 = str2
或str1 != str2
等号两边一定要有空格整数的比较
-eq
=,-ne
!=,-gt
>,-lt
<,-ge
>=,-le
<=逻辑运算
!
非,-o
或,-a
与
命令组合:经常命令检测之后执行多条命令
{}
:在当前shell中执行,命令组合最后有分号1
[ -d $DIR ] && { cd ..; ls -l; ps; } | less
()
:在子进程中执行,命令组合最后无分号1
[ -d $DIR ] $$ ( cd..; ls -l; ps ) | less
条件结构
1 2 3 4 5 6 7
if condition then list elif condition then list else list fi
6.9.4 表达式运算expr
- 运算类型:
()
,五种算术运算,六种关系运算,& |
与或,:
正则 - 注意运算符的转义
:
正则:expr str : pattern
- 从最左字符开始尽量匹配,最终输出匹配的长度
- 使用的是基本正则语法,但是
\+
\?
\|
表示匹配一个或多个,匹配0个或1个,或(两端任选其一) - 使用
\( \)
,将其中匹配的内容提取出来
6.9.5 循环结构
while
1 2 3
while condition do list done
for
1 2 3 4 5 6 7 8 9 10 11 12 13 14
for name in word1, word2, ... do list done # 或者 for name do list done # 相当于 for name in $1, $2, ... do list done for i in `seq 1 255` # 相当于for i in range(1,256)
break n
:跳出n层循环continue
exit val
:结束脚本执行,返回值为val
6.9.6 其他
eval
:将参数先进行变量替换或加工,然后将结果作为程序来执行