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
:筛选文件中重复的行
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
正则表达式与文件名通配符规则不同
.
:匹配任意单字符
*
:匹配前面单字符0次或任意多次
[
:方括号内的字符为集合,表示其中任意一个,方括号内的.
*
\
表示自己,[ ][ ]
表示左右中括号的两个字符,-
表示一个区间(如果在最后则不表示区间)
\
^
:在中括号内时开头表示补集,[^a-z]
表示匹配任一非小写字母(如果不在中括号内开头则不表示补集),在正则表达式开头时表示首部的限制(不在首部则不表示此限制)
$
:在正则表达式尾部时表示尾部的限制(不在尾部则不表示此限制)
()
:分组|
:逻辑或+
:匹配前面单字符1次或任意多次?
:匹配前面单字符0次或1次{m,n}
:匹配前面的单字符m到n次{m}
:匹配前面的单字符m次{m,}
:匹配前面的单字符至少m次\d
:数字, \D
:非数字,\s
:空白符(包括换行), \S
:非空白符(不包括换行), \w
:数字字母下划线(相当于 [A-Za-z0-9_])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
:逐行扫描进行条件判断,满足条件执行动作
awk入门教程 - 阮一峰
vim常用操作
vim编辑结束后Ctrl+S:Linux进入了流量控制状态,Ctrl+Q流量控制解除
Ctrl+Z导致进程挂起(进程还在但是处于Stopped状态):使用jobs
命令查看当前Stopped的进程,使用%1
将1号作业恢复到前台运行
backspace无法使用:Ctrl+H或者stty erase ^H
Linux和Windows的文本文件存储格式不同(行尾不同),dos2unix/unix2dos转换
ldd
:用来查看程序运行时所需的共享库更详细的blog:LINUX 文件系统都是什么鬼
command后面跟着的是参数或文件通配符,shell进行替换,而正则表达式不进行替换
*
:匹配任意长度的文件名字符串(包括空串),当.
作为开头或是包含/
时,必须显示匹配?
:匹配任一单字符[]
:集合,匹配其中任一字符~
:当前用户主目录.
:当前目录/
:根目录,斜线/
,反斜线\
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
:递归深度env
打印当前环境变量,PATH是可执行文件的查找路径,CLASSPATH是类库查找路径,使用export来添加环境变量文件系统命令
mkfs
:创建文件系统
mount, umount
:安装、卸载文件系统
df
:查看文件系统空间空间
文件系统结构
引导块:启动系统
专用块:管理快(或超级块),存放文件系统的管理信息
i节点区:每个文件一个i-node,包括索引、指针和文件信息
文件存储区:目录表(文件名和i-node指针)和文件内容
硬链接:目录项指定的“文件名 i-node”映射关系
ln file.txt lnk # 创建file.txt的硬链接lnk,删除lnk时对应i-node的link数减一,仅限于同一个文件系统中的普通文件
软链接(符号链接):创建一个“符号链接文件”,里面存储路径(如果时相对路径,则相对于该符号链接文件)
ln -s file.txt lnk # 创建file.txt的软链接lnk
chmod [ugoa][+-=][rwxst] file
命令解释器,交互式方式下替换、转义、内部外部命令,非交互式方式下编写脚本程序批量处理
注册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 ..
chmod u+x test.sh; . test.sh ..
在.bashrc中添加一个别名
alias lls = "ls -lh"
输入重定向
<
:从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秒
set -u
:当引用一个未定义的变量时,产生一个错误set +u
:当引用一个未定义的变量时,视为一个空字符串set -x
:打印出shell替换后的命令和参数,常用于观察命令经过shell替换后哪里错误set +x
:取消set -x
echo
:打印命令行参数
-e
:转义打印printf
:类似C语言
printf "home:%s\n" $HOME
read
:获取用户输入
子进程继承父进程的环境变量,以后再不影响
.
放入PATH,PATH以:
分隔路径env
:列出环境变量set
:列出环境变量、局部变量、函数定义文件名生成替换:遵循文件通配符规则
变量替换:$var
命令替换:以命令的stdout进行替换, ``````````(反撇号)或者 $()
now = `date`
now = $(date)
$var
或${var}
,引用未定义变量认为是空字符串$0, $1, $2
:第一个命令行参数(脚本文件本身的名字),第二个命令行参数,第三个命令行参数$#
:命令行参数的个数$*
:相当于"$1 $2 $3 ..."
将整体作为一个参数$@
:相当于"$1" "$2" "$3" ...
将变长的命令行参数传递给其他命令shift n
:位置参数的移位操作,位置参数顺次向前移动n个位置空格,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 # 只使用转义,不被引号包括的字符串
逻辑判断
命令的返回码是0,则命令执行成功
$?
输出上一个命令的返回码,用管道连接时以最后一个命令的返回码为准
&&
||
:与,或,可以短路
cmd1 && cmd2 # cmd1执行失败就不执行cmd2
cmd1 || cmd2 # cmd1执行成功就不执行cmd2
检测命令:test
或[
(是一个命令而非词法符号,最后一个参数必须是])
文件特性检测:
-f
普通文件,-d
目录文件,-r
可读,-w
可写,-x
可执行,-s
size>0
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中执行,命令组合最后有分号
[ -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
expr
()
,五种算术运算,六种关系运算,& |
与或, :
正则:
正则:expr str : pattern
\+
\?
\|
表示匹配一个或多个,匹配0个或1个,或(两端任选其一)\( \)
,将其中匹配的内容提取出来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
eval
:将参数先进行变量替换或加工,然后将结果作为程序来执行.9.4 表达式运算expr
()
,五种算术运算,六种关系运算,& |
与或, :
正则:
正则:expr str : pattern
\+
\?
\|
表示匹配一个或多个,匹配0个或1个,或(两端任选其一)\( \)
,将其中匹配的内容提取出来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
eval
:将参数先进行变量替换或加工,然后将结果作为程序来执行蒋砚军, 高占春. 实用 UNIX 教程[M]. 清华大学出版社, 2005.
Linux开发环境及应用
W3Cshcool;UNIX 入门指南