本文重点是脚本开发时会常用的命令和一些提高效率的高频系统操作命令,其他命令(主要是运维方面的,如网络操作、硬件操作、文件打包等)后续补充。
该文配合【系统性学习】Linux Shell易忘重点整理(会有概念的解释)循序渐进学习更好。
-a all,可列出隐藏目录,即以.开头的文件
-l long,列出详细信息,显示修改时间,如vi并修改会改变修改时间
-lu 显示访问时间,如cat会改变文件访问时间
-lc 显示状态改变时间,如chmod操作会改变文件状态
-t 时间顺序排序
-S 文件从大到小排序
-r 逆序
-h human,文件大小以人能阅读的方式展展示,把字节数转成k,M,G
-d 查看目录本身信息 ls -ld /bin,列出当前目录下所有目录 ls -d */
# 样例
ls -lSh #文件从小到大排序,并详细展示
head -5 file
显示文件file的前5行,tail -f flie
循环更新显示尾部新增数据。wc [-clw][--help][--version][文件...]
>wc text.txt
5 3 15 text.txt
> wc testfile testfile_1 testfile_2 #统计三个文件的信息
3 92 598 testfile #第一个文件行数为3、单词数92、字节数598
9 18 78 testfile_1 #第二个文件的行数为9、单词数18、字节数78
3 6 32 testfile_2 #第三个文件的行数为3、单词数6、字节数32
15 116 708 总用量 #三个文件总共的行数为15、单词数116、字节数708
help cmd | less
。常用操作:/字符串:向下搜索"字符串"的功能
?字符串:向上搜索"字符串"的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b: 向上翻一页
空格键: 向下翻一页
ctrl + f: 向上翻一页
ctrl + b: 向下翻一页
G: 移动到最后一行
g: 移动到第一行
q: 退出 less 命令
cd -
回到上次跳转目录 cd ~
到用户主目录mkdir -p path
-p 不存在的目录一路创建下去原文件名_bak
,可以防止存在的文件被覆盖而没备份。原文件名_bak
,可以防止存在的文件被覆盖而没备份。ln -s 源文件 链接文件 #软链接或符号链接
ln 已存在的源文件 链接文件 #硬链接
chmod +x file
等价chmod a+x file
。chmod [-cfvR] [--help] [--version] mode file...
mode:[ugoa...][[+-=][rwxXst]...][,...]
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
r=4,w=2,x=1, SUID的s=4,SGID的s=2, 粘滞位t=1
chmod ug=rwx,o=x file
chmod 777 file
chmod 4777 file #第一位的值由s和t决定
关于权限s和t
13. vi,常用功能:
[Ctrl] + [f] | 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) |
[Ctrl] + [b] | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
0 或功能键[Home] | 这是数字『 0 』:移动到这一行的最前面字符处 (常用) |
$ 或功能键[End] | 移动到这一行的最后面字符处(常用) |
G | 移动到这个档案的最后一行(常用) |
gg | 移动到这个档案的第一行,相当于 1G 啊! (常用) |
n | n 为数字。光标向下移动 n 行(常用) |
x, X | 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) |
dd | 剪切游标所在的那一整行(常用),用 p/P 可以粘贴。 |
ndd | n 为数字。剪切光标所在的向下 n 行,例如 20dd 则是剪切 20 行(常用),用 p/P 可以粘贴。 |
dG | 删除光标所在到最后一行的所有数据 |
yy | 复制游标所在的那一行(常用) |
nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) |
p, P | p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) |
u | 复原前一个动作。(常用) |
[Ctrl]+r | 重做上一个动作。(常用) |
. | 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) |
:%s/word1/word2/gc | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!,不用确认则省略c(常用) |
i | 光标前添加 |
O | 光标上面新建一行 |
o | 光标下面新建一行 |
A | 光标所在行行尾添加 |
-printf
选项,支持的能力和内置命令printf
有较大区别,详情可参考链接。find path option operater
operater 默认是 -print, 也可以是 -exec或-ok command {} \; #{}表示找到的文件,使用ok替换-exec 增加用户交互,如
find / -type f -size 0 -exec ls -l {} \;
常用option:
-name file ,file支持通配符,且要有单引号或者双引号包围
-type X, X可取 d: 目录 c: 字符设备 b: 块设备 p: 管道 f: 一般文件 l: 符号连结 s: socket
-mtime n : 在过去 n 天内修改过的文件
-cmin n : 在过去 n 分钟内被修改过
-pid n : 进程id 是 n 的文件
-printf :格式化打印
-maxdepth n :搜索深度为n层目录默认是循环查找所有深度
多个option可以使用 ( ) 分隔,并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
# 一个常用的-printf选项
>find $dir -name '*.txt' -maxdepth 1 -printf '%p,' # 将找到的文件名变成用,分割的一个字符串。
a.txt,b.txt,c.txt,
cat /proc/version
。type command
cat file1.txt file2.txt>file.txt
,合并文件,合并后的按文件顺序。set
显示所有变量和函数定义,set -o
显示所有set可控制的选项。set -o 选项
开启选项,set +o 选项
关闭选项。 set 可以丢弃掉原有位置参数,设置新的位置参数,如set 10 20
,则$1=10 $2=20
,set --
清除所有位置参数,不包括$0
。set都有快捷开关,如set -e
是开启errexit选项(同set -o errexit
),set +e
则是关闭。cat test.sh
echo $# params
echo $*
set A B C D E#重置位置参数
echo $# params
echo $*
set -- #清空位置参数
echo $# params
echo $*
常用选项P275
选项名 | 快捷键 | 含义 |
---|---|---|
errexit | -e | 若有一个命令的返回值不等于0(失败),则立即退出shell |
ignoreeof | 无 | 禁用 |
noglob | -f | 关闭通配符 |
noclobber | -C | 防止文件重定向时被覆盖 |
notify | -b | 后台任务完成时通知用户 |
verbose | -v | 为调试打开verbose模式,脚本运行时显示读入的每行命令,并原样打印 |
xtrace | -x | 为调试打开echo模式,脚本运行时显示变量替换后的每行命令和参数 |
nounset | -u | 有变量未定义时提示错误信息 |
noexce | -n | 读命令,解释但不执行,用来检查脚本语法 |
unset 变量
。tee file.txt
同时输出到标准输出和文件。-a
则追加模式到文件。命令 | 作用 |
---|---|
exec command | 执行command,完成后相当于再执行一个exit,退出shell |
exec < file | 正常的输入重定向,file命令到exec执行,最后在执行个exit,不如运行source file |
exec > file | 标准输出重定向到文件file |
exec m< file | m为整数,将file读入到文件描述符fd/m中,若不存在则自动创建文件描述符m,可进入/dev/fd下查看。命令执行后,文件内容就到m中了,直到m中的内容被消费掉。如cat <& m ,不能重复消费。创建的m只有r权限,没有w权限。执行该命令后,file只能用重定向追加写>> file ,如果用vi修改,或者> 重定向到file,则m软链接中的file就被删除。用于配合下面命令使用。 |
command <& m | 文件描述符m中的内容作为command的输入。只在执行的时候,才会消费一遍m中没被消费的内容 |
exec m> file | 将m中的内容重定向到文件file中,若不存在则自动创建文件描述符m。执行后,m中的内容会持续输出到file中。创建的m只有m权限,没有r权限,用于配合下面命令使用。 |
command >& m | command的输出重定向到m,且为追加模式 |
exec m<& - | 关闭文件描述符m,/dev/fd/m被删除 |
exec <& - | 关闭标准输入,自动运行exit 退出shell |
exec >& - | 关闭标准输出,还原exec > /dev/tty 但这样还原的标准输出只有读权限,或 先tty查看当前pts为/dev/pts/0 ,则exec > /dev/pts/0 原理上也行,但会报权限问题。也可退出再重新登陆还原。 |
ulimit -n | 查看文件描述符最大值 |
ulimit -n m | 设置文件描述符最大值为m,m最大取值和系统有关,2048,4096等 |
该命令创建的文件描述符,在退出shell后会清除。该功能可用于增量处理,同时记录数据。
文件描述符,不能随意像创建普通文件那样创建。
#测试创建m的权限
>exec 4< test.sh
>exec 5> xlt.log
>ls -l /dev/fd/*
lrwx------ 1 user_client users 64 Oct 22 21:14 /dev/fd/0 -> /dev/pts/0
lrwx------ 1 user_client users 64 Oct 22 21:14 /dev/fd/1 -> /dev/pts/0
lrwx------ 1 user_client users 64 Oct 22 21:14 /dev/fd/2 -> /dev/pts/0
lr-x------ 1 user_client users 64 Oct 22 19:46 /dev/fd/4 -> /home/user_client/test.sh
l-wx------ 1 user_client users 64 Oct 22 19:46 /dev/fd/5 -> /home/user_client/xlt.log
>chmod u+w /dev/fd/4 #执行成功也无法改变权限
>ls -l /dev/fd/4
lr-x------ 1 user_client users 64 Oct 22 19:51 /dev/fd/4 -> /home/user_client/test.sh
>exec 4> xlt4.log # 覆盖原权限
>ls -l /dev/fd/4
l-wx------ 1 user_client users 64 Oct 22 19:52 /dev/fd/4 -> /home/user_client/xlt4.log
#测试删除
> exec 4< test.sh
> ls -l /dev/fd/4
lr-x------ 1 user_client users 64 Oct 22 21:15 /dev/fd/4 -> /home/user_client/test.sh
>cat <& 4
line1
line2
>echo "line3">> test.sh
>cat <& 4
line3
>vi test.sh#随便修改任何地方
> ls -l /dev/fd/4
lr-x------ 1 user_client users 64 Oct 22 21:17 /dev/fd/4 -> /home/user_client/test.sh~ (deleted)
# 测试用普通文件方式创建文件描述符
> ls -l fd #可见需要root权限,且链接到内存
lrwxrwxrwx 1 root root 13 Aug 19 2015 fd -> /proc/self/fd
>ls -ld /proc/self/fd
dr-x------ 2 user_client users 0 Oct 22 21:40 /proc/self/fd
> sudo ln -s /home/user_client/xlt.log 5 #不加sudo也无法创建
ln: failed to create symbolic link `5': No such file or directory
> chmod u+w /proc/self/fd #该目录无法修改权限
chmod: changing permissions of `/proc/self/fd': Operation not permitted
-a
可从键盘读取数组。-p 提示prompt,后面跟提示信息,即在输入前打印提示信息。
-n 后跟一个数字,当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量
-t timeout,后面跟秒数,定义输入字符的等待时间
-s 安静模式,在输入字符时不再屏幕上显示(实际也显示,设置成背景色),例如login时输入密码
# 限定数目 和 提示 限时
read -n 1 -t 5 -p "Do you want to continue [Y/N]?" answer
# 同时读取多个变量
read v1 v2 v3
75 76 78 --键盘输入
# 一行行处理文本
count=1 # 赋值语句,不加空格
cat test.txt | while read line # 每次调用 read 命令都会读取文件中的 "一行" 文本。当文件没有可读的行时,read 命令将以非零状态退出
do
echo "Line $count:$line"
count=$[ $count + 1 ] # 注意中括号中的空格。
done
echo "finish"
exit 0
# 创建数组
> read -a arr
12 34 56 --键盘键入,以空格分割,回车结束
readonly -p
同declare -rp
列出所有只读变量。readonly -a 数组名
(同 declare -ra 数组名
)。非常难删除,需要使用gdb通过C语言函数才能删除,一般不要将变量变成只读。declare [+/-][aAfFgilrtux][-p][name[=value]...]
+/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
选项作用:
-f 显示函数名和定义,declare -f 显示当前shell所有函数定义详情,declare -f fun1,显示fun1定义详情;或指定函数操作, declare -fx fun1, 导出函数
-F 仅显示函数名, declare -F 显示当前shell所有函数名
-g 在函数中,定义全局变量
-p 打印相关值,declare -p同set,显示所有变量和函数定义。 declare -p arr 打印数组arr的详情,declare -ap打印所有数组详情
用来设定属性:
-a 指定数组属性
-A 定义关联数组(即其他语言的map,Bash4.0以上才有)
-i 使变量具有整型属性
-l 赋值时将字母转为小写
-u 赋值时将字母转为大写
-r 赋予只读属性,函数,数组,变量 都可以赋予只读。
-t 赋予trace属性(对变量无效,只对函数有效)
-x 导出变量或函数,declare -fx fun1, 导出函数,等同 export -f fun1
export [-fnp][变量名称]=[变量设置值]
。history -c
清空历史命令记录,慎用。|
和&
取非空非0参数 b. 因为四则表达式只能处理整型字符串,所以可以用来判断某个变量是不是整数。用法1: expr EXPRESSION
用法2: expr OPTION
用法1:打印表达式EXPRESSION 的结果到标准输出。EXPRESSION可以是(注意,运算符两边必须要有空格,特殊含义的运算符要用/转义):
ARG1 | ARG2 输出ARG1如果ARG1非null或非0, 否则输出ARG2,ARG可以试字符串
ARG1 & ARG2 输出ARG1 如果ARG1和ARG2都非空且非0,否则输出0,ARG可以试字符串
ARG1 < ARG2 小于
ARG1 <= ARG2 小于等于
ARG1 = ARG2 等于(或者==)
ARG1 != ARG2 不等于
ARG1 >= ARG2 大于等于
ARG1 > ARG2 大于
ARG1 + ARG2 加
ARG1 - ARG2 减
ARG1 * ARG2 乘
ARG1 / ARG2 除
ARG1 % ARG2 取余
用法2:字符串处理
STRING : REGEXP 输出STRING中匹配正则表达式REGEXP的字符长度
STRING : \(REGEXP\) 输出STRING中匹配正则表达式REGEXP的字符
match STRING REGEXP 同 STRING : REGEXP
match STRING \(REGEXP\) 同 STRING : \(REGEXP\)
substr STRING POS LENGTH 取子字符串, POS从1取值
index STRING CHARS 第一次出现CHARS的index,否则为 0
length STRING 字符串长度
+ TOKEN 将特殊字符或关键字解释为字符串如`match' 或`/'
> expr length match
expr: syntax error
> expr length + match #把match理解为字符串
5
# 判断变量是不是整数
> k=5
> expr 1 + $k >/dev/null 2>&1
> echo $?
0
> k=sss
> expr 1 + $k >/dev/null 2>&1
> echo $?
2
> (( 1 + $k)) >/dev/null 2>&1 ##其他方法不能成功判断,这里的逻辑其实是(( 1 + sss)),sss当做变量且为值空,当做0,最终该表达式的结果为1。
> echo $?
0
basename /opt/user
得到user。dirname /opt/user
得到/opt
。exit N
带整型参数,则退出状态为N,这个特点可以配合if(产生exti不同结果)和case(对不同结果做处理)命令使用。命令 << AAA
...
AAA
cat << INPUT
asdf
asdfa
asd
INPUT
# 等价
echo "asdf
asdfa
asd"
# 结合case使用,模拟select命令
cat << INPUT
choose your role
A)student
B) teacher
INPUT
read var
case $var in
A)
...;;
B)
...;;
*)
echo "error";;
esac
:
表示,什么也不做,类似python里面的pass。:
后还可以带参数,带不带参数:的退出状态都是0。作用:# 间隔语句,防止报错,或开发时占位,后续补充逻辑
if 命令
then
: #这个地方留空或空格,会报错,then和else贴在一起了
else
xxx
fi
# : 后面可以接参数的,这个特点可用于帮助非命令表达变成命令
:${var:=5} #var在为空时,赋值为5,没有:会报错
> echo $var
5
>: dsaf sdf e f
> echo $?
0 - 带任意参数都不报错
shift N
表示左移 N个,即讲原来的$1
和$N
废弃,将${N+1}
赋值给$1
,${N+N}
赋值给$N
,然后位置参数个数减N。$#),则shift N
命令无效,原位置参数不变;
III. 若$#==N
,则相当于位置参数被清空。
# 常见脚本,模拟getopts命令,缺点:不能实现命令组合-ab
while [$# -ge 1]
do
opt=$1
case $opt in
-a)
do something
shift
;;
-b)
do something
shift
;;
...
esac
done
-
开头的字符串,且该字符串中的字母会被存到var中,等待后续处理。如果字母后面如果冒号,表示该选项有参数,且参数将存入 OPTARG中备用。?
,程序也能继续运行。opts中选项的顺序没有关系。:
,程序也能继续运行。:
,即:opts
,则可关闭上面两个错误提示,两种情况var都存入?
getopts opts var
# 样例,脚本getopts.sh中
while getopts :aw:nm OPTION
do
case $OPTION in
a) echo "a";;
m) echo "m";;
n) echo "n";;
w) echo "w $OPTARG";;
'?'|':') echo ""Usage is : $(basename $0) [-amn] [-w number];; #'?'|':') 也可换成*)
esac
echo "OPTIND=$OPTIND"
done
> getopts.sh -anm -w 30 -q i -r
a
OPTIND=1 --下一个还是再处理第一个位置参数-anm
n
OPTIND=1 --下一个还是再处理第一个位置参数-anm
m
OPTIND=2 --下一个处理第二个位置参数-w
w 30
OPTIND=4 --因为一下用了两个-w 30,所以从2变到4
Usage is : getopts.sh [-amn] [-w number]
OPTIND=5 --下一个确实要处理第5个,但i没带-,处理不了,程序停止
select 变量 [in 列表] #[in 列表] 可省略,相当于in "#@"
do
命令(命令组) #不主动退出会无限循环
done
#应用样例,脚本中有如下代码
echo "please choose your gender: "
select gender in "male" "female" "quit"
do
case $gender in
"quit")
break;;
"male"|"female")
echo "Your gender is $gender";;
*)
echo "Wrong selection $REPLY";;
esac
done
unset [-fv][变量或函数或数组名称或数组[下标]]
-f 仅删除函数。
-v 仅删除变量。
unset a #不管a是数组还是变量还是函数,都删除
unset -v a #只有a是变量和数组时,才能删除
unset -f a #只有a是函数时,才能删除
> y=(aa bb cc)
> echo $y
aa
> echo $y
aa
> unset y
> echo $y
> y=(aa bb cc)
> unset -v y
> echo $y
> y=(aa bb cc)
> unset -f y
> echo $y
aa
grep [选项] 查找模式(支持正则) 文件名 [文件名 ...]
-i 忽略大小写
-v 取反
-n 显示匹配行在文件中行号
-c 显示匹配次数(行数)
# 样例
grep book * #从当前目录所有文件中查找包含book的行
grep -v ^$ t.txt # 取非空行
> echo -e "abc tasf\nabc tefs" |grep "abc"
abc tasf
abc tefs
> echo -e "abc tasf\nabc tefs" |grep -c "abc"
2
user_client@host-10-31-17-80:~> echo -e "abc tasf abc\nabc tefs" |grep -c "abc"
2
> cat text.txt |grep "\" #包含单词man的行,等价 grep "\bman\b"
cut 选项 文件名
-c[n,k-m,j-] 分别按行取第n,第k-m个,第j到结尾的字符
-d 指定域分割符,默认为制表符(Tab)
-f[n,k-m,j-] 分别按行取第n,第k-m个,第j到结尾的域
> cat t.txt
abc def ghi jkm lno
abc def ghi jkm lno
abc def ghi jkm lno
> cut -c1,5-7 t.txt
adef
adef
adef
> cut -d " " -f2,4 t.txt
def jkm
def jkm
def jkm
-d
指定分割符。> cat a.txt
25
28
23
> cat b.txt
Mike
Jack
> cat c.txt
His
Eng
Math
> paste -s a.txt
25 28 23
> paste a.txt b.txt c.txt
25 Mike His
28 Jack Eng
23 Math
> cat /etc/passwd|cut -d : -f1 |paste -s # 配合使用,在一行打印所有用户名
root bin daemon lp user_client sysomc
tr [选项] [第一字符集] [第二字符集]
-s 压缩相同字符
-d 删除字符
> echo "abcdABCD123" | tr [a-b] X
XXcdABCD123
> echo "abcdABCD123" | tr [[:lower:]] X
XXXXABCD123
> echo "aaa bbb ccc" | tr -s [a-b]
a b ccc
> echo "aaa bbb ccc" | tr -d [a-b]
ccc
> echo "aaa bbb ccc" | tr aaa [K*] #实际等价于 tr a [k*]
KKK bbb ccc
> echo "aaa bbb ccc" | tr ab [K*] #ab是当做字符集的,而不是一个整体
KKK KKK ccc
> echo "aaa bbb ccc" | tr ab"" [K*]
KKK KKK ccc
> echo "aaa bbb ccc" | tr a" "b [K*]
KKKKKKKKccc
sort [选项] 文件名
-b 忽略每行前面开始出的空格字符。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-n numeric-sort,依照数值的大小排序。
-t<分隔字符> 指定排序时所用分隔字符。默认为制表符Tab。
-u 去掉重复行
-r 逆序
-R Random,随机排序
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
-k field1[,field2]] 按指定的列进行排序。
-o<输出文件> 将排序后的结果存入指定的文件。
> cat sort.txt
25 Mike His
28 Jack Eng
23 Tom Math
> cat sort.txt | sed -n l
25\tMike\tHis$
28\tJack\tEng$
23\tTom\tMath$
> cat sort.txt|sort -k 1 -n
23 Tom Math
25 Mike His
28 Jack Eng
+++
49. sed,流编辑器(stream editor)。sed对没行内容处理,无论内容是否变化,都默认打印每行通过sed的内容。sed '' 文件名
相当于cat 文件名
。sed和awk一样,无论是否找到,退出状态都为0,当语法错误时,才为非0。写sed脚本时注意:
I. 脚本中命令两边不需要单引号了
II. 用于插入或替换的文本很长超过一行时,要用续行符\
III. 每行的末尾不要有多余的空格和Tab
sed [选项] '命令' 文件名
sed -f sed脚本名 文件名 #等价 sed脚本名 文件名,其中sed脚本首行要是#!/bin/sed -f
'命令'前可以加数字k,m,'k,m命令'表示仅处理文件的第k到m行。
常用选项:
-r 支持扩展的正则表达式,如
-i 将替换结果直接存回文件,后可接字符串,表示将源文件备份的后缀(也可不加,表示不备份)
-n 取消默认输出
-e 用于同一行执行多个操作,sed -e [选项1] '命令1' -e [选项2] '命令2' 文件名,等价sed [选项1] '命令1'; [选项2] '命令2' 文件名
常用命令:
s 's/regexp/replacement/flags',按行将匹配到的正则表达式regexp替换成replacement,
同时,被匹配到的regexp被存到&中,可在replacement中调用他,如'\u&' 将匹配到的转成大写,'\l&'转小写,'AA&'前面加上AA等。
flag可取:
空,则替换行内第一个匹配
数字N,替换行内第N个匹配
g,行内全部替换
i,忽略大小写
p 打印文本,支持正则匹配打印/regexp/p
d 删除文本,支持正则匹配删除/regexp/d
w 'w file',将匹配文本存入另一个文件,支持正则匹配,sed -n '/regexp/w text.txt'
l 显示不可打印字符
a 'a\line1\n\line2' 在当前行之后添加一行或多行,支持正则匹配对匹配行做处理, sed '/regexp/a\line1\n\line2' a.txt。'$a\line1',$表示最后一行,即在最后一行后面增加line1。
i 'i\line1\n\line2' 在当前行之前添加一行或多行,支持正则匹配
c 'c\line1\n\line2' 用新行(一行或多行)替换当前行,支持正则匹配
#样例
> echo "AA#BB" |sed -r 's/(.+)#(.+)/\1\t\2/' #\1和\2分别代表第一个括号和第二个括号匹配到的内容
AA BB
> sed -i 's/A/a/g' a.txt # 将a.txt中的A全部换成a
> sed -i_bak 's/A/a/g' a.txt # 将a.txt中的A全部换成a,并备份源文件
> sed -n '1,3p' a.txt #打印a.txt的前3行,若没有-n则前三行打印两遍
> cat sort.txt |sed -nr '/E+/p'
28 Jack Eng
> cat sort.txt |sed -r '/E+/d' #删除至少含有一个E的行
25 Mike His
23 Tom Math
> cat sort.txt |sed -r '1,2d' #删除前两行
23 Tom Math
> echo "aa bb" |sed -n l #此命令无法直接输入,只是举例,可用cat来实际检验
aa\tbb
> sed -r '/E+/a\AA\n\BB' sort.txt
25 Mike His
28 Jack Eng
AA
BB
23 Tom Math
>sed 's/[A-Z]/\l&/g' a.txt #将所有大写字母转小写
#sed脚本
> cat sed.sh
#!/bin/sed -f
s/A/a/
$a\XLT
$i\Yours
> echo "AAbb" |./sed.sh
Yours
aAbb
XLT
awk,一种处理文本文件的语言,是一个强大的文本分析工具。叫 awk是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。awk是一门脚本编程语言,内容很多,详情可见独立章节。awk对分割后的列处理,比较方便。
pritnf,格式化输出。格式化字符串一般用双引号括起来,包含三种类型的字符:
I. 普通字符
II. 转义字符,如\n
(echo默认带换行符,printf不带,需要显示写在字符串中)
III. 格式提示符(format-specifier),如%d
,%s
,配合参数一起使用
printf [-v 变量] 格式化字符串 [参数]
-v var :printf的输出不显示在屏幕上,而是记录在变量var中
> printf "Good Morning\n"
Good Morning
> printf -v g "Good Morning\n"
> echo $g
Good Morning
> echo "Good Morning\n"
Good Morning\n
> echo -e $g
Good Morning
> a=1.234
> printf "a=%f\n" $a
a=1.234000
> printf "a=%10.3f;\n" $a
a= 1.234;
> printf "a=%-10.3f;\n" $a
a=1.234 ;
常用格式提示符:
提示符 | 含义 |
---|---|
%s |
输出一个字符串 |
%d |
有符号十进制数 |
%u |
无符号十进制数 |
%c |
ASCII字符 |
%f |
浮点数,格式为[-]w.precision ,w为显示的总宽度,-表示左对齐(没有则表示右对齐),precision表示精度,默认6位 |
%% |
打印一个百分号 |
ps [options]
-f 显示更多信息,full-format listing
-u 显示比-f更详细的信息
-e 查看所有账户的进程
ps -ef |grep 账户名 查看其他账户进程
> ps -f
UID PID PPID C STIME TTY TIME CMD
1000 15924 18549 0 15:45 pts/2 00:00:00 ps -f
1000 18549 18548 0 15:28 pts/2 00:00:00 -bash
-- PPID: 为父进程PID
-- STIME: 为启动时间
-- TTY: 终端的次要装置号码 (minor device number of tty)
> id
uid=1000(user_client) gid=100(users) groups=100(users),16(dialout),33(video),6601(onip)
> ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1000 14288 0.0 0.0 114460 3000 pts/4 Ss 09:34 0:00 -bash
1000 16616 0.0 0.0 114460 3048 pts/1 Ss 14:37 0:00 -bash
1000 17620 0.0 0.0 114460 3136 pts/0 Ss+ 09:43 0:00 -bash
...
-- %CPU: 占用的 CPU 使用率
-- %MEM: 占用的记忆体使用率
-- VSZ: 占用的虚拟记忆体大小
-- RSS: 占用的记忆体大小
-- STAT: 该行程的状态
[作业号]+/-
,+表示最近一个作业,-表示前一个作业。jobs [options]
-l 显示详细信息,带进程ID
-p 仅显示进程ID
-s 仅显示状态为Stoped的作业
-r 仅显示状态为running的作业
> vi test.txt # 按
[1]+ Stopped vi test.txt
> jobs
[1]+ Stopped vi test.txt
> jobs -l
[1]+ 19610 Stopped vi test.txt
> jobs -s
[1]+ Stopped vi test.txt
> jobs -p
19610
> jobs -sl
[1]+ 19610 Stopped vi test.txt
54 fg/bg,命令放到前后台执行。命令格式fg [引用]
。%1
等价 fg %1
;%1 &
等价 bg %1
。
引用 | 含义 |
---|---|
%N |
作业号为N的命令 |
%+ |
最近一个作业 |
%% |
同上 |
无引用,同上 | |
%- |
最近第二个作业 |
%str |
命令以str开头的作业 |
%?str |
命令包含str的作业 |
kill 进程号
默认向进程传递 15) SIGTERM
信号Terminate终止。常用信号 | 含义 |
---|---|
1) SIGHUP |
挂起-关闭进程通信连接 |
2) SIGINT |
中断–通知进程退出 |
3) SIGQUIT |
退出–强制进程退出 |
6) SIGABRT |
放弃进程 |
9) SIGKILL |
终止进程,该信号不能被截获 |
15) SIGTERM |
正常停止一个进程,该信号可被截获,kill命令的默认信号 |
20) SIGTSTP |
挂起正在运行的进程 |
kill -l #列出所有信号的编号及信号名
kill -l 数字 #列出对应信号名
kill -l 信号名 #列出对应编号
kill [-s 信号名|-n 信号编号|-信号名|-信号编号] 进程号或%作业号# |表示或
> kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
> vi test.txt &
[2] 32574
> kill -9 %2
> kill -9 32574 #等价
wait [进程号或%作业号]
trap '命令' 信号编号
命令 可以多个命令组合,用分号;分割,命令为空时,表示什么都不做,即禁用信号的能力
信号 可以试多个信号编号,用空格分割
# 例如在某脚本开头写上
trap 'echo "exit";exit' 2 3
则运行脚本后,按<Ctrl+C>和<Ctrl+\>都可以打印exit再退出脚本
trap '' 2 3
什么也不做,2 3信号失去能力
disown [option] [%作业号]
-a 隐藏所有作业
-h 屏蔽SIGUP信号
-r 所有running的作业
-f
。可用于仅开一个窗口的情况下,开启多个shell。用fg可把挂起shell放到前台运行。> bash
-- 开启子shell
> echo $SHLVL
2 --在shell的第2层
> suspend -f #挂起子shell
[3]+ Stopped bash
> echo $SHLVL
1
> fg %3 #回到子shell
bash
> echo $SHLVL
2
eval [命令]
> f="cat a.txt"
> cat a.txt
line1 in txt
> echo $f
cat a.txt
> eval $f
line1 in txt
# 获取最后一个参数,在脚本中写入
eval echo \$$#
# 模拟指针
> a=10
> point_a=a
> eval echo \$$point_a
10
> eval $point_a=60
> echo $a
60
shopt -s 选项
开启选项set;shopt -u 选项
关闭选项unset。常用选项 | 含义 |
---|---|
dotglob | 通配符模式匹配以(.) 开头的文件名 |
extglob | 通配符开启扩展模式 |
nocaseglob | 通配符号忽略大小写 |
expand_aliases | 别名功能,交互式shell默认打开,非交互式shell默认关闭 |
shift_verbose | shift移动数大于参数个数时,提示错误 |
stty 设置项 操作字符 # 更换操作
> stty -a #显示全部配置
speed 38400 baud; rows 39; columns 156; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
> echo "$IFS" | od -b
0000000 040 011 012 012
0000004
更多命令还可查阅:
Linux命令大全
英文详情