【系统性学习】Linux Shell常用命令

本文重点是脚本开发时会常用的命令和一些提高效率的高频系统操作命令,其他命令(主要是运维方面的,如网络操作、硬件操作、文件打包等)后续补充。
该文配合【系统性学习】Linux Shell易忘重点整理(会有概念的解释)循序渐进学习更好。

脚本开发和高频系统操作

  1. ls 命令:
-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 #文件从小到大排序,并详细展示
  1. head ,tail 默认打印10行内容,head显示前10行,tail显示尾10行。可加参数控制显示行数,head -5 file 显示文件file的前5行,tail -f flie 循环更新显示尾部新增数据。
  2. wc,-l -w -c 对应行数,单词数,字节数,默认都显示。
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 
  1. less,用于查看较长的内容,如查看某命令帮助文档,help cmd | less。常用操作:
/字符串:向下搜索"字符串"的功能
?字符串:向上搜索"字符串"的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b: 向上翻一页
空格键: 向下翻一页
ctrl + f: 向上翻一页
ctrl + b: 向下翻一页
G: 移动到最后一行
g: 移动到第一行
q: 退出 less 命令
  1. cd, cd -回到上次跳转目录 cd ~到用户主目录
  2. mkdir,创建目录。mkdir -p path -p 不存在的目录一路创建下去
  3. cp, cp是危险的,会覆盖已有同名文件,加参数-b 自动将旧文件备份成原文件名_bak,可以防止存在的文件被覆盖而没备份。
  4. mv, mv是危险的,会覆盖已有同名文件,加参数-b 自动将旧文件备份成原文件名_bak,可以防止存在的文件被覆盖而没备份。
  5. ln,软链接:如果“源”被删除,则内容无法找回。硬链接:如果希望同一个文件在多个目录下保持一致,则用硬链接。注意目录不能建立硬链接。
ln -s 源文件 链接文件 #软链接或符号链接
ln 已存在的源文件 链接文件 #硬链接
  1. stat,查看文件三种时间:访问时间,修改时间和状态改动时间。访问时间包括vi,cat等命令查看,状态改变包括chmod、ln或者内容改变。
  2. touch,创建空文件或改变文件时间戳(包括访问时间,修改时间和状态改动时间)。
  3. chmod,支持两种语法。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 光标所在行行尾添加
  1. echo, -E 禁止转义,-e 使能转义, -n 去掉换行符。
  2. file,查看文件类型.
  3. tree,目录树状显示,某些系统不支持。tree -L 3 显示3层。
  4. find,文件查找。比较特殊的是其中的-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,
  1. bash --version查看bash版本,也可以cat /proc/version
  2. type查看命令类型。type command
  3. cat,cat file1.txt file2.txt>file.txt,合并文件,合并后的按文件顺序。
  4. set,set 显示所有变量和函数定义,set -o显示所有set可控制的选项。set -o 选项 开启选项,set +o 选项关闭选项。 set 可以丢弃掉原有位置参数,设置新的位置参数,如set 10 20,则$1=10 $2=20set --清除所有位置参数,不包括$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 禁用退出shell,必须用exit
noglob -f 关闭通配符
noclobber -C 防止文件重定向时被覆盖
notify -b 后台任务完成时通知用户
verbose -v 为调试打开verbose模式,脚本运行时显示读入的每行命令,并原样打印
xtrace -x 为调试打开echo模式,脚本运行时显示变量替换后的每行命令和参数
nounset -u 有变量未定义时提示错误信息
noexce -n 读命令,解释但不执行,用来检查脚本语法
  1. unset,清除变量定义。unset 变量
  2. tee,三通命令,tee file.txt同时输出到标准输出和文件。-a则追加模式到文件。
  3. exec,系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。可以用来操作文件描述符。
命令 作用
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
  1. read,用于从键盘读取变量或从文本一行行读取,加-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 --键盘键入,以空格分割,回车结束
  1. readonly, 将变量变成只读(同declare -r),readonly -pdeclare -rp列出所有只读变量。readonly -a 数组名(同 declare -ra 数组名)。非常难删除,需要使用gdb通过C语言函数才能删除,一般不要将变量变成只读。
  2. declare,和typeset功能完全一致,typeset有被淘汰的趋势,优先使用declare。更多参考:【Linux 系统设置 env,export,set,declare 的区别】
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

  1. export,导出变量或函数。export [-fnp][变量名称]=[变量设置值]
  2. readarray(等价 mapfile),内置命令,该命令有些系统不支持,可忽略。从标准输入(或文件)读入数组。
  3. env(同printenv),外部命令,打印的环境变量不全(如没有PS1),全量的还是需要用set查看。环境变量一搬认为是经过了export的大写字母命名的变量。
  4. history,查看历史命令,history -c 清空历史命令记录,慎用。
  5. expr, 字符串处理和表达式处理。表达式应用的新作用在于。a. |&取非空非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
  1. basename,取路径最后一部分,一般用于取文件名。 basename /opt/user得到user。
  2. dirname,取路径除最后一部分的其他部分,一般用于取路径。 dirname /opt/user得到/opt
  3. exit, 运行到这个命令,其后的命令不再执行。exit的退出状态默认为前一条命令的退出状态。也可以exit N带整型参数,则退出状态为N,这个特点可以配合if(产生exti不同结果)和case(对不同结果做处理)命令使用。
  4. here。用来向一条命令传递输入。还没发现这个命令的独特之处。AAA可以试任何有标识性的字符串,为了标记要输入的内容的开头和结尾
命令 << 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
  1. null命令,即空命令,一个:表示,什么也不做,类似python里面的pass。:后还可以带参数,带不带参数:的退出状态都是0。作用:
# 间隔语句,防止报错,或开发时占位,后续补充逻辑
if 命令
then
	: #这个地方留空或空格,会报错,then和else贴在一起了
else
	xxx
fi

# : 后面可以接参数的,这个特点可用于帮助非命令表达变成命令
:${var:=5} #var在为空时,赋值为5,没有:会报错
> echo $var
5
>: dsaf sdf e f
> echo $?
0 - 带任意参数都不报错
  1. shift命令控制位置参数移动。默认左移一个,然后位置参数的个数减一。
    I. shift N表示左移 N个,即讲原来的$1$N废弃,将${N+1}赋值给$1,${N+N}赋值给$N,然后位置参数个数减N。
    II. 若不够移动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
  1. getopts,处理脚本参数。检查脚本的位置参数中是否有以-开头的字符串,且该字符串中的字母会被存到var中,等待后续处理。如果字母后面如果冒号,表示该选项有参数,且参数将存入 OPTARG中备用。
    I. 当输入不在opts中列出的选项时,系统会提示出错,var中存入?,程序也能继续运行。opts中选项的顺序没有关系。
    II. 当需要参数的选项没带参数时,系统会提示出错,var中存入 ,程序也能继续运行。
    III. opts前加:,即:opts,则可关闭上面两个错误提示,两种情况var都存入?
    IV. 内置变量OPTIND会记录脚本的下一个参数的索引,具体用法见示例。
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没带-,处理不了,程序停止
  1. select,用来展示界面菜单,并供用户选择。不主动退出会无限循环,强制停止或表示EOF(End of File)正常退出。用户输入变量存在REPLY中。一般和case组合使用,COLUMNS和LINES设定展示的宽度和长度。
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
  1. unset,删除变量或函数。数组属于变量。
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
  1. grep,单引号,双引号,不加引号,在grep后仍具有其本身的能力。如果找到了所查找的模式,则退出状态为0,否则为非0。
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"
  1. egrep,可用linux中正则表达式扩展的能力。
  2. cut,纵向取内容,支持按字符、域来取。
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
  1. paste,把来自多个文件的多行命令粘合在一起(默认分割符为制表符Tab)(无参数),或者把来自一个文件的多行转成一行(默认分割符为制表符Tab)(-s)。-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

  1. tr,translate,字符删除或变换。能处理的字符集范围比较特别(跳转查看),字符集支持POSIX,有不少巧妙应用。仅能按单个字符处理。
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
  1. sort,默认按字典序。sort重定向时,不能和源文件重名,否则源文件被清空,但用-o选项时,可以重名。
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
  1. awk,一种处理文本文件的语言,是一个强大的文本分析工具。叫 awk是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。awk是一门脚本编程语言,内容很多,详情可见独立章节。awk对分割后的列处理,比较方便。

  2. 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位
%% 打印一个百分号
  1. ps,显示当前进程的状态,类似于 windows 的任务管理器。
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: 该行程的状态
  1. jobs,查看作业。作业号只在当前shell有效,从1开始。[作业号]+/-,+表示最近一个作业,-表示前一个作业。
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的作业
  1. kill,用来给作业或者进程发送信号。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 #等价
  1. wait,等待命令结束,如果wait后不带参数,则等待该shell中所有子进程都结束,可用于等待并发编程结果。
wait [进程号或%作业号]
  1. trap, 捕获信号并做处理。信号9不能被捕获。
trap '命令' 信号编号
命令 可以多个命令组合,用分号;分割,命令为空时,表示什么都不做,即禁用信号的能力
信号 可以试多个信号编号,用空格分割
# 例如在某脚本开头写上
trap 'echo "exit";exit' 2 3
则运行脚本后,按<Ctrl+C><Ctrl+\>都可以打印exit再退出脚本
trap '' 2 3
什么也不做,2 3信号失去能力
  1. disown,从jobs命令中隐藏作业,但在ps中还是能查到
disown [option] [%作业号]
-a 隐藏所有作业
-h 屏蔽SIGUP信号
-r 所有running的作业
  1. suspend,挂起当前shell,挂起登陆shell需要加-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
  1. eval,二次扫描命令,第一次扫描,如果有变量,则进行变量的替换,第二次将参数作为shell命令执行他。
    I. eval这个特性长用来取得最后一个参数。
    II. eval还可以用来模拟指针
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 

  1. shopt,即shell options,set命令的扩展和补充。shopt -s 选项开启选项set;shopt -u 选项关闭选项unset。
常用选项 含义
dotglob 通配符模式匹配以(.)开头的文件名
extglob 通配符开启扩展模式
nocaseglob 通配符号忽略大小写
expand_aliases 别名功能,交互式shell默认打开,非交互式shell默认关闭
shift_verbose shift移动数大于参数个数时,提示错误
  1. stty,即set tty,终端设置命令。
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


  1. od, od是Octal Dump的简写,用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。
> echo "$IFS" | od -b 
0000000 040 011 012 012 
0000004

更多命令还可查阅:
Linux命令大全
英文详情

你可能感兴趣的:(Linux,linux,学习,运维)