1. linux入门
1.1 实用程序
-
man
:查询联机手册man (section) name # section:1命令,2系统调用,3库函数,5配置文件(因为可能有同名的) man -k regexp # 用正则匹配
-
date
:获取时间和日期date "+%Y-%m-%d %H:%M:%S Day %j" # 格式控制字符串必须以+号开头
-
bc
:计算器bc -l # 类似于ipython的交互式界面
-
重定向
ls -l > filelist.txt # 输出重定向 sort < filelist.txt # 输入重定向 ls -l >> filelist.txt # 追加内容
-
管道
ls -l | sort # 将ls的stdout作为sort的输入
-
more, less
:逐屏显示(文件或输出),less可以向上翻页但是more不行less -Nm # fb翻页,du翻半页,gG第一/最后一行,v编辑,/?向下或上搜索字符串(nN上一个下一个)
-
cat
:列出文件内容;od
:逐字节打印cat -n test.txt cat > file.txt # 没有命令行参数,从stdin获取输出,直到Ctrl-D,将内容写入文件
-
head, tail
head -n 20 file.txt # 显示前20行 hand -n -20 file.txt # 除了尾部20行,其余算头并显示 tail -f file.txt # 实时打印文件尾部追加的内容
-
tee
:三通,将stdin输出到stdout,同时写入文件中ls -lh | tee out.txt
-
wc
-w
:字计数-l
:行计数
ps -ef | wc -l # 查看当前进程总数 ls | wc -w # 查看当前文件夹下文件个数
-
sort
:-r
:降序-o
:结果覆盖原文件-n
:按照数字而非字符串排序
-
tr str1 str2
:替换字符串,将stdin中str1的字符替换为str2的字符,然后标准输出cat file.txt | tr '[a-z]' '[A-Z]' # 将file.txt文件中小写字母替换为大写字母
-
unique
:筛选文件中重复的行
1.2 了解系统状态
-
who
:确定谁在系统中tty # 输出当前终端设备文件名 who am i # 输出当前终端上的登录用户
-
uptime
:已开机时间当前时间 开机时间 用户数量 CPU负载(1,5,15分钟内有几个进程在等待调度运行)
-
top
:列出资源占用排名靠前的进程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格式列出
UID PID PPID C(最近几秒占用CPU情况) PRI优先级 SZ进程逻辑地址空间 WCHAN进程在何处睡眠 TTY终端名字 TIME累计占用CPU时间 CMD
-
free
:了解内存使用情况内存总量 已使用内存 空闲内存 共享内存 缓冲使用的内存 现在实际可以使用的内存
-
vmstat
:了解系统负载vmstat 1 -Sm # 每一秒更新一次 最关注的是cpu使用率,us=user, sy=system, id=idle, wa=wait for disk IO
2. 正则表达式
2.1 元字符
正则表达式与文件名通配符规则不同
-
.
:匹配任意单字符 -
*
:匹配前面单字符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
:提取匹配的部分grep -n 'main' *.cpp # 从文件中筛选 ps -ef | grep -n '^zhang' # 从输入中筛选
-
-
sed
:利用正则表达式处理文本(替换、删除等)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
:用来查看程序运行时所需的共享库
更详细的blog:LINUX 文件系统都是什么鬼
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之后和分号之前作为一条命令,{}表示文件路径名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批处理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”映射关系
ln file.txt lnk # 创建file.txt的硬链接lnk,删除lnk时对应i-node的link数减一,仅限于同一个文件系统中的普通文件
-
软链接(符号链接):创建一个“符号链接文件”,里面存储路径(如果时相对路径,则相对于该符号链接文件)
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中添加一个别名
alias lls = "ls -lh"
6.4 重定向和管道
-
输入重定向
-
<
:从file中获取输入 -
<<
:从shell脚本中获取输入cat << WORD Now: `date` WORD # WORD是定界符,之间内容进行替换并执行获取输入 cat << 'WORD' Now: `date` WORD # 当定界符有单引号时,之间内容不做替换
-
<<<
:从命令行获取信息作为标准输入base64 <<< 'test'
-
-
输出重定向
-
>
:覆盖,stdout重定向 -
>>
:追加内容到文件,stdout重定向 -
1>
:将句柄1(stdout,标准输出)重定向 -
2>
:将句柄2(stderr)重定向 -
2>&1
:将标准输出(stdout)和标准错误(stderr)保存到同一个文件,放在命令最后command > log.txt 2>&1 # command 将command的stdout和stderr输出到同一个文件log.txt command >> log.txt 2>&1 # command 将command的stdout和stderr内容追加到同一个文件
# >和>>可以混用,比如正确的结果追加到right.txt,错误的结果重定向覆盖到wrong.txt command 1>>right.txt 2>wrong.txt
-
/dev/null
:黑洞文件 -
管道
|
将前一命令的stdout作为后一命令的stdin,同样可以使用2>&1
gcc test.c > test.err 2>&1 | less
-
-
管道:
|
- 注意管道符连接的多个命令是并行执行的,有时命令会阻塞等待标准输入
sleep 5 | sleep 5 # shell会同时启动两个进程,执行结果是sleep 5秒
- 注意管道符连接的多个命令是并行执行的,有时命令会阻塞等待标准输入
6.5 设置
set -u
:当引用一个未定义的变量时,产生一个错误set +u
:当引用一个未定义的变量时,视为一个空字符串set -x
:打印出shell替换后的命令和参数,常用于观察命令经过shell替换后哪里错误set +x
:取消set -x
6.6 常用命令
-
echo
:打印命令行参数-e
:转义打印
-
printf
:类似C语言printf "home:%s\n" $HOME
-
read
:获取用户输入
6.7 环境变量
子进程继承父进程的环境变量,以后再不影响
- 使用export将局部变量转为环境变量
- PATH:命令查找路径,不要将
.
放入PATH,PATH以:
分隔路径 env
:列出环境变量set
:列出环境变量、局部变量、函数定义
6.8 替换
-
文件名生成替换:遵循文件通配符规则
-
变量替换:
$var
-
命令替换:以命令的stdout进行替换, ``````````(反撇号)或者
$()
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:命令行参数分隔符
-
回车:运行命令
-
><|
:重定向与管道(还有||
) -
;
:一个内多个命令(还有;;
) -
&
:后台运行(还有&&
) -
$
:引用变量 -
`````````:反撇号用于命令替换,出现元字符注意转义,可以嵌套但要转义
\\
、\`
year=`expr \`date '+%Y'\` - 10 `
-
文件通配符:
*[]?
-
()
:用于定义shell函数或在子shell中执行一组命令 -
"
:除了$
和`````````,其他的特殊字符都不转义,里面只能有四种转义:\"
、\$
、\`
、 `\` -
'
:都不转义,中间不能有单引号(可以拆分成多段)在*.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,则命令执行成功
-
$?
输出上一个命令的返回码,用管道连接时以最后一个命令的返回码为准 -
&&
||
:与,或,可以短路cmd1 && cmd2 # cmd1执行失败就不执行cmd2 cmd1 || cmd2 # cmd1执行成功就不执行cmd2
-
-
检测命令:
test
或[
(是一个命令而非词法符号,最后一个参数必须是])-
文件特性检测:
-
-f
普通文件,-d
目录文件,-r
可读,-w
可写,-x
可执行,-s
size>0test -r myfile.txt && echo readable [ -r myfile.txt] && echo readable
-
-
检测命令是否执行成功
-
比较
-
字符串比较:shell中有三种字符串
str1 = str2
或str1 != str2
等号两边一定要有空格 -
整数的比较
-eq
=,-ne
!=,-gt
>,-lt
<,-ge
>=,-le
<= -
逻辑运算
!
非,-o
或,-a
与
-
-
-
命令组合:经常命令检测之后执行多条命令
-
{}
:在当前shell中执行,命令组合最后有分号[ -d $DIR ] && { cd ..; ls -l; ps; } | less
-
()
:在子进程中执行,命令组合最后无分号[ -d $DIR ] $$ ( cd..; ls -l; ps ) | less
-
-
条件结构
if condition then list elif condition then list else list fi
6.9.4 表达式运算expr
- 运算类型:
()
,五种算术运算,六种关系运算,& |
与或,:
正则 - 注意运算符的转义
:
正则:expr str : pattern
- 从最左字符开始尽量匹配,最终输出匹配的长度
- 使用的是基本正则语法,但是
\+
\?
\|
表示匹配一个或多个,匹配0个或1个,或(两端任选其一) - 使用
\( \)
,将其中匹配的内容提取出来
6.9.5 循环结构
-
while
while condition do list done
-
for
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
:将参数先进行变量替换或加工,然后将结果作为程序来执行
.9.4 表达式运算expr
- 运算类型:
()
,五种算术运算,六种关系运算,& |
与或,:
正则 - 注意运算符的转义
:
正则:expr str : pattern
- 从最左字符开始尽量匹配,最终输出匹配的长度
- 使用的是基本正则语法,但是
\+
\?
\|
表示匹配一个或多个,匹配0个或1个,或(两端任选其一) - 使用
\( \)
,将其中匹配的内容提取出来
6.9.5 循环结构
-
while
while condition do list done
-
for
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
:将参数先进行变量替换或加工,然后将结果作为程序来执行
7. 其他资料
蒋砚军, 高占春. 实用 UNIX 教程[M]. 清华大学出版社, 2005.
Linux开发环境及应用
W3Cshcool;UNIX 入门指南
recommand: linux checklist from PLCT