文章目录
最近碰到的命令
1.curl密令
curl -d '{"content": "S0765056F"}' -H 'Content-Type: application/json' -X POST https://www.baidu.com
curl --location --request POST 'https://www.baidu.com' --header 'Content-Type: application/json' --data-raw '{ "key": "value"}'
一、基础命令(Unix命令)
Rundeck是一个基于Java和Grails的开源的运维自动化工具,提供了Web管理界面进行操作,同时提供命令行工具和WebAPI的访问控制方式。像Ansible之类的工具一样,Rundeck能够帮助开发和运维人员更好地管理各个节点。
1.运行sh脚本命令:
./xxx.sh文件
:当前目录,该命令必须给.sh文件加x执行权限
/home/epay/uploadserver_wql/xxx.sh
:绝对路径
sh xxx.sh
:当前目录,该命令不需要赋权限
sh /home/epay/uploadserver_wql/xxx.sh
:绝对路径,该命令不需要赋权限
cmd1 && cmd2
:执行cmd1和cmd2两个命令
sh -c "cmd1 && cmd2"
:执行-c后字符串中的命令。如:sh -c “./1.sh && ./test.sh”
2.echo命令:
echo -n
:不换行输出echo -e
:将转义后的内容输出到屏幕上,常见转义字符:\b(删除前一个字符)、\c、\n、\f、\t
3.exit命令:
exit 0
:代表正常运行程序并退出程序exit 1
:代表非正常运行导致退出程序
两个的区别只有一点,即表示程序(sh脚本)的运行结果不同,在 shell 中调用完程序(sh脚本)之后,用 echo $?
命令就可以看到程序的 exit 值。在 shell 脚本中,通常会根据上一个命令的 $?
值来进行一些流程控制。
4.sed命令
sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。
比如:将linuxfocus 替换为LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作。sed是按行来处理文本内容的。在shell中,使用sed来批量修改文本内容是非常方便的。
sed [选项] [function]
选项:
- -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
- -e :直接在命令列模式上进行 sed 的动作编辑;
- -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
- -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
- -i :直接修改读取的文件内容,而不是输出到终端。
- -c:use copy instead of rename when shuffling files in -i mode???
function:
- a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
- c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
- d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
- i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
- s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g
一般是替换符合条件的字符串而不是整行
所有的新增,删除,替换行,这些命令前面的地址修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面。
- m,n 表示对m和n行之间的所有行进行操作,也包含第m行和第n行。
- $表示最后一行,例如:m,$d就是删除m行以及其后面的所有行内容。
- 可以对某一行进行操作,例如:2d表示仅仅删除第2行。
- 可以使用正则表达式选出符合条件的行,并对这些行进行操作,在sed中正则表达式是写在 /…/ 两个斜杠中间的。比如:/2/ 表示所有包含2的行,/^2/ 表示以2开头的行。
sed '1,2d' test.xx # 删除第一行和第二行,d表示删除
sed '/2/d' test.txt # 删除所有包含2的行
# a命令表示在指定行的后面附加一行,
sed '1a hello world' test.txt # 在第一行后添加hello world,如果a的前面没有地址限定,则在所有行后面都会添加
sed '1i hello world' test.txt # 命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串
sed '1c hello world' test.txt # 命令c会替换指定的行的所有内容,替换成其后面的字符串,
# sed中除了上面的命令是针对整行进行操作的之外,还提供一个替换命令,该命令对某一行中的部分字符串进行操作
# s/待替换的字符串/新字符串/
sed 's/aa/AA/' test.txt # 替换每一行遇到的第一个aa
sed 's/aa/AA/g' test.txt # g表示进行全局替换,每一行中所有符合条件的旧字符串都会被替换成新字符串
sed '5,$s/aa/AA/g' test.txt # 第5行直到文件末尾的所有行进行搜索替换操作
sed '/^[0-9]/s/aa/AA/g' test.txt # 该正则表达式表示对所有以数字开头的行,执行s操作
# sed还提供一个p命令用于搜索符合条件的行,并输出该行的内容,而不做其他的任何修改
# 实际上sed默认情况下是会将所有标准输入的数据又重新输出到标准输出的
sed '2p' test.txt # 将文件的所有内容输出了一遍,而第2行则多输出了一次,
# 我们可以加上 -n 选项让sed仅仅是输出经过处理之后的那些行,而不是输出之前从标准输入中获取到的所有行内容
# -n 选项一般是与p命令联合使用的,其他的增加,删除,替换行的命令是不需要 -n 选项的
sed -n '2p' test.txt # 仅输出p命令的处理结果了,只输出第2行
5.cut命令
cut命令可以从一个文本文件或者文本流中提取文本列。比如:输出每行第5-9个字符cut -b 5-9 file.txt
。
cut命令主要是接受三个定位方法:
[root@localhost ~]$ date
2011年 08月 11日 星期四 20:44:52 EDT
[root@localhost ~]$ date |cut -b 10,1-7 # cut会先把-b后面所有的定位(1-7,10)进行从小到大排序,再提取
2011年8
[root@localhost ~]$ date |cut -c 5,9,13
年月日
[root@localhost ~]$ echo $PATH
/zzy/zookeeper-standlone/bin:/zzy/hbase-0.98.8-hadoop2/bin:/zzy/hadoop-2.6.0/bin:/zzy/hadoop-2.6.0/sbin:
/usr/local/java/jdk1.7.0_79/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]$ echo $PATH | cut -d ':' -f 1-3,5
/zzy/zookeeper-standlone/bin:/zzy/hbase-0.98.8-hadoop2/bin:/zzy/hadoop-2.6.0/bin:/zzy/hadoop-2.6.0/sbin:/usr/local/sbin:/usr/local/bin:/sbin
- 1.字节(bytes),一个空格算一个字节,一个汉字算三个字节。用选项-b
- 2.字符(characters),中文字符和空格都算一个字符。用选项-c
- 3.域(fields),用选项-f,与 -d 一起使用。-d指定域分隔符,-f 指定要剪出哪几个域。-d选项的默认间隔符就是制表符(\t),所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。
6.awk命令
awk 用来从文本文件中提取字段。缺省地(不指定时),字段分割符是空格,可以使用-F指定其他分割符。
cat file.txt | awk -F, '{print $1 "," $3 }'
:-F指定,
为字段分割符,并打印第一、三个字段。如果该文件内容下:Adam Bor, 34, IndiaKerry Miller, 22, USA。命令输出结果为:Adam Bor, IndiaKerry Miller
7.ls命令
ls [选项] [目录名]
:
-t 表示以时间排序
-d 表示对于目录,只列出目录(不递归列出目录内的文件)
-i 输出文件的 i 节点的索引信息。
-l 列出文件的具体信息(小写L)。
ls
:不带任何参数,列出当前目录下所有文件和目录(不递归列出目录内的文件)
ls [通配符]
:如果匹配多个,则会列出当前目录下和通配符匹配的文件和目录(会递归列出目录内的文件)
;如果只匹配到一个文件,则会列出该文件;如果只匹配到一个目录,则会列出该目录下所有的文件和目录(不再递归列出目录内的文件)
ls 文件名
:当前目录存在,则列出文件名;不存在报错。ls 目录名
:当前目录存在,则列出目录下文件和目录(不再递归);不存在报错。
注意:当使用通配符、具体文件名或目录名时,并且名称以-开头(如:名为-ac的目录),则使用命令时,需在前边加–(如:ls -- -ac
ls -- *a*
)
ls -td -- */
:列出当前文件夹下,匹配*/的文件和目录(不递归),目录名可以-开头。*/表示列出目录,因为文件名称不会带/;ls -I name1 -I name2
:列出当前文件夹下,除了name1 和name2的文件和目录。(注意:和小写i含义不同)
8.cat命令
cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的;
cat主要有三大功能:
cat filename
:一次显示整个文件。cat > filename
:从键盘创建一个文件。只能创建新文件,不能编辑已有文件。cat file1 file2 > file
:将几个文件合并为一个文件。
其它命令:
wc –l file
wc -w file
wc -c file
: 计算文件行数、计算文件中的单词数、计算文件中的字符数cat file.txt
: 输出文件内容到标准输出设备(屏幕)上find
: 搜索文件。比如:根据文件名搜索find . -name filename -print
mkdir [选项] 目录名称
:-p 创建多级目录,目录存在时不会给出目录存在的提示信息,而是若目录已经存在,则不创建;若是不存在,则创建新目录grep -v "grep"
:反向查找,查找不含有 grep 字段的行。如:查看包含 ‘/home/helife/tomcat-wap/’ 但不包含 “grep” 的进程ps -ef | grep '/home/helife/tomcat-wap/' | grep -v "grep"
cp -f file dir
:拷贝文件,-f选项,强制拷贝文件rm
:-r 选项,递归删除目录,可删除空目录;-f选项,强制删除超级用户所创建的文件。unlink [参数] 文件名
:是用于删除单个文件的命令行实用程序,其功能效果与rm命令一致,选择习惯用的就好。用于删除符号连接时,符号链接指向的文件并不会被删除;用于删除指定的文件,您需要对包含该文件的目录具有写权限。 否则,将出现“不允许操作”错误;在GNU/Linux系统中,不能用于删除一个目录。readlink [参数] [文件]
:找出符号链接所指向的位置chmod -R 755 file
:ln -s 源文件 目标文件
: -s 表示软连接,只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间;没有参数-s表示硬链接,会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。head -n 1 文件名
:显示文件中的前1行。-n表示行;-c表示字节;wget --no-check-certificate url
:下载文件到当前目录,–no-check-certificate用于下载https的资源unzip [选项] 压缩包名 -d 目的地目录
:-o表示不必先询问用户,unzip执行后覆盖原有的文件
set -e
:该命令之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出,不会继续执行命令。当管道的非最后一个命令返回非零值,出现例外,使用下面命令解决。
set -o pipefail
:pipeline中的命令出错了,把这个非零返回值往后传递,作为整行命令的返回值。如果一个pipeline里面有多个命令执行返回非零值,后面的会覆盖前面的。
二、变量、正则表达式、转义字符
1.变量:
系统中的变量根据作用域及生命周期可以分为四类:本地变量、环境变量、全局变量、内置变量
0.export说明(父 shell 与子 shell):
1.父 shell:用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行 shell脚本程序。
2.子 shell:运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。
3.export说明:在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
4.总结:当前父shell中定义变量中,分为本地变量和环境变量,不同点是局部变量只能作用于本父shell,子shell无法继续使用,如果使用了export将局部变量定义为全局变量,那么父shell在创建子shell的时候会将该变量一同复制给子shell的环境。
1.本地变量(局部变量、用户变量、临时变量、自定义变量):用户自定义的变量,定义在脚本或者当前终端(会话)中,脚本执行完毕或终端(会话)结束变量失效。
变量名='变量值'
:定义变量export 变量名
:将变量提升为全局环境变量,供其他Shell程序使用export 变量名='变量值'
:直接定义,并暴露为全局变量
A=1
$AB # 此时表示AB是一个变量名,而系统中不存在该变量,所以输出值为空
${A}B # 此时会输出1B,表示系统将A看作变量
B=(1 2 3 4 5)
${a[0]} # 数组中第一个元素
${a[@]:0:3} # 数组中1-3个元素
${#a[@]} #数组中元素的个数
2.环境变量:定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用,可在多个sh脚本中使用。在环境关闭后,变量就会失效。
env
查看当前用户的环境变量,常用环境变量:$HOME
、$PWD
、$SHELL
、$USER
等;set
查看当前用户的所有变量(临时变量与环境变量)export A=hello
:定义一个临时变量,临时将一个本地变量(临时变量)变成环境变量(全局变量)vim .bash_profile 或者 ~/.bashrc
A=hello
:定义一个永久生效变量
3.全局变量:
- 使用export命令将本地变量输出为当前shell中的环境变量(临时有效)
- 在 /etc/profile 下永久定义,所有用户及shell都可以使用。
vim /etc/profile
source /etc/profile
4.内置变量(系统变量、特殊变量):内置bash中变量,shell本身已经固定好了它的名字和作用
$n
:n为数字,$0
为该脚本名称,$1-$9
为第1-9个参数,10以上的参数需用大括号,如${10}
$#
:执行脚本时,输入参数个数,常用于循环$*
:执行脚本时,输入的所有参数,把所有的参数看成一个整体$@
:执行脚本时,输入的所有参数,不过会把每个参数区分对待,执行main函数命令main "$@"
$?
:最后一次执行的命令的返回状态(或脚本的返回值)。0,非0分别表示上一个命令执行正确、错误。
若退出状态值为0,表示命令运行成功
若退出状态值为127,表示command not found
若退出状态值为126,表示找到了该命令但无法执行(权限不够)
若退出状态值为1&2,表示没有那个文件或目录$$
:当前所在进程的进程号,如:kill -9 `echo $$` 退出当前会话
2.正则表达式:
正则表达式是一种可以用于模式匹配和替换的工具。通过正则表达式,Shell可以使用一系列的特殊字符构建匹配模式,然后将匹配模式与待比较字符串或文件进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
1.通配符用于模式匹配,如字符串查找、文件名匹配与搜索等。 常用通配符有以下6种。
ls *log* # 含有log字符串,log.log os.log
ls a?c # adc apc
ls [abc-fp] # 表示a、b、c、d、e、f、p之中的任一字符。
ls [!ab] # 表示不是a或b的任一字符。c e f
# ls命令不会把^和$识别为特殊符号,而是作为文件和目录的一部分,因此需要使用管道和grep -E这个选项支撑正则表达式。
ls | grep -E ^ubuntu # ubuntu_linux
ls | grep -E linux$ # ubuntu_linux
- *(星号):表示任何字符串,可以匹配空字符串。
- ?(问号):表示任何单个字符。
- [](一对方括号):表示一个字符序列。除连字符“-”之外,其他特殊字符在[]中都是普通字符,包括*和?。
- !(感叹号):在[]中使用!表示排除其中任意字符。
- ^(幂符号):只在一行的开头匹配字符串。
- $(美元符号):只在行尾匹配字符串,它放在匹配单词的后面。
2.模式表达式:模式是那些包含一个或多个通配符的字符串,各模式之间以竖线(|)分开。bash除支持上述通配符外,还提供了以下特有的扩展模式匹配表达式。
ls file*(.c|.o) # 匹配文件file、file.c、file.c.c、file.c.o、file.o、file.o.c、file.o.o等,不匹配file.h、file.s等
ls file+(.c|.o) # 匹配文件file.c、file.c.c、file.c.o、file.o、file.o.c、file.o.o等,但不匹配file。
ls file?(.c|.o) # 只匹配文件file、file.c、file.o等,不匹配file.c.c、file.c.o等。
ls file@(.c|.o) # 只匹配文件file.c和file.o,但不匹配file、file.c.c、file.c.o等。
ls file!(.c) # 可以匹配file、file.c.c、file.c.o、file.o、file.o.c、file.o.o,但不匹配file.c。
- *:匹配任意多个模式。(注:匹配0个或多个模式)
- +:匹配一个或多个模式。(注:匹配1个或多个模式)
- ?:匹配模式表中任何一种模式。(注:匹配0个或1个模式)
- @:仅匹配模式表中一个给定模式。(注:匹配1个模式)
- !:除给定模式表中的一个模式之外,它可以匹配其他任何字符串。
3.转义字符:
echo "hello\
world"
#显示以下结果
helloword
- \回车:下一行是当前行的续行
- \n:换行
- \t:水平制表
- \r:回车
- \a:警告
- \b:回格
4.用户变量命名时,反引号(``)、单引号(‘’)、双引号(“”)的区别
echo -e "\a现在时间 \n `date`"
# 现在时间
# Sat Jul 1 16:58:12 CST 2023
echo 'hello \n world'
# hello \n world
str=hello
echo '$str'
# $str
str=hello
echo -e "$str \n world" # echo 输出的时候加上-e 表示识别转义字符,默认不识别
# hello
# world
1.反引号(``):包含的内容,做为 shell 命令被执行,执行结果替换原内容。使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`:查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。将所有查找到的文件打一个包。
2.单引号(‘’):又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉, 包含的变量名称不会被解析,任何字符都会原样输出。
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
3.双引号(“”):又叫软转义,可以存在通配符,也可存在变量,会被解析。
三、管道、重定向
这些不是系统命令,但是他们真的很重要。
1.管道
管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep “hello” file.txt | wc -l
2.输入/输出重定向
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
command > file
:将输出重定向到 file。命令执行command然后将输出的内容存入file,覆盖旧文件。command < file
:将输入重定向到 file。本来需要从键盘获取输入的命令会转移到文件读取内容。command >> file
:将输出以追加的方式重定向到 file。加到文件的尾部,保留旧文件内容n > file
:将文件描述符为 n 的文件重定向到 file。n >> file
:将文件描述符为 n 的文件以追加的方式重定向到 file。n >& m
:将输出文件 m 和 n 合并。n <& m
:将输入文件 m 和 n 合并。<< tag
:将开始标记 tag 和结束标记 tag 之间的内容作为输入。
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
$ command > file # 将 stdout 重定向到 file。
$ command < file # 将stdin 重定向到 file。
#将stderr 重定向到 file、追加到 file 文件末尾
$ command 2>file
$ command 2>>file
将 stdout 和 stderr 合并后重定向到 file
$ command > file 2>&1
$ command >> file 2>&1
#command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
$ command < file1 >file2
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null。/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是/dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
$ command > /dev/null
#cmd 2>stderr.txt 1>stdout.txt == cmd> output.txt 2>&1
$ command > /dev/null 2>&1 # 屏蔽 stdout 和 stderr, 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。
$ command 2> /dev/null # 忽略掉错误提示信息
四、流程控制
1.if命令
if语句会运行if后面的那个条件(命令),如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。
if command1
then
commands
else
if command2
then
commands
fi
fi
1.用于数值比较、字符串比较、文件比较的单方括号[expression]
(test命令)
a=6
if [ $a -gt 5 ]
then
echo "a>5"
fi
- 数值比较:-eq、-ge、-gt、-le、-lt、-ne(不等)
- 字符串比较:=、!=、<、>;-n str1(str1长度是否非 0)、-z str1(str1长度是否为 0)
- 文件比较:-d file(file存在并是一个目录)、-e file(存在)、-f file(存在并是一个文件)、-L(存在并是一个符号链接)、-r file(存在并可读)、-s file(存在并非空)、-w file(存在并可写)、-x file(存在并可执行)、-O file(存在并属当前用户所有)、-G file(存在并且默认组与当前用户相同)、file1 -nt file2( file1比file2新)、file1 -ot file2 (file1比file2旧)
2.用于数学表达式的双括号 (( expression ))
a=10
if (( $a ** 2 > 90 ))
then
(( b = $a ** 2 ))
echo "The square of $a is $b"
fi
- 数学表达式:val++(后增)、val–、++val、–val、 !(逻辑求反)、~ (位求反)、 ** (幂运算)、 << (左位移) 、 >>(右位移) 、&(位布尔和)、|(位布尔或)、&&(逻辑和)、||(逻辑或)
3.用于高级字符串处理功能的双方括号 [[ expression ]]
if [[ $usr == r* ]] # 双方括号命令:对$usr环境变量进行匹配,看它是否以字母 r 开头。
then
echo "Hello $user"
else
echo "Sorry, I do not know you"
fi
- 脚本中使用了双等号( == )。双等号将右边的字符串( r* )视为一个模式,并应用模式匹配规则。
- 注意,不是所有的shell都支持双方括号。
2.case命令
s="word"
case $s in
"hello") echo This is hello;;
"word") echo This is word;;
"A" | "B") echo good;;
esac
3.select命令
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other";
do echo "You have selected $var"
break
done
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
4.loop命令
while ....;
do ....
done
for var in A B C ;
do echo "var is $var"
done