shell 命令语法

read 命令

语法 命令用于从标准输入读取数值。
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]

参数说明:
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
read -rp "Port choice [1-3]: " -e -i 1 PORT_CHOICE

grep 命令

语法格式:
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

常用选项:
--help
-V, --version
-G, --basic-regexp        BRE 模式,也是默认的模式
-E, --extended-regexp  ERE 模式
-P, --perl-regexp           PRE 模式
-F, --fixed-strings          指定的模式被解释为字符串
-i 忽略大小写
-o 只输出匹配到的部分(而不是整个行)
-v 反向选择,即输出没有没有匹配的行
-c 计算找到的符号行的次数
-n 顺便输出行号

uniq 命令

uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
uniq 可检查文本文件中重复出现的行列。

命令语法:

uniq [-c/d/D/u/i] [-f Fields] [-s N] [-w N] [InFile] [OutFile]
-c: 在每列旁边显示该行重复出现的次数。
-d: 仅显示重复出现的行列,显示一行。
-D: 显示所有重复出现的行列,有几行显示几行。
-u: 仅显示出一次的行列
-i: 忽略大小写字符的不同
-f Fields: 忽略比较指定的列数。
-s N: 忽略比较前面的N个字符。-w N: 对每行第N个字符以后的内容不作比较。
[InFile]: 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
[OutFile]: 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。


示例:
1.只对相邻的行内容去重
uniq kaikai.txt
sort -u kaikai.txt
2.配合sort完全去重
sort kaikai.txt | uniq
3.去重计数
sort kaikai.txt | uniq -c

sort 命令

用法:sort [选项]... [文件]...
串联排序所有指定文件并将结果写到标准输出。

排序选项:

-b, --ignore-leading-blanks 忽略前导的空白区域
-d, --dictionary-order 只考虑空白区域和字母字符
-f, --ignore-case 忽略字母大小写
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 只排序可打印字符
-n, --numeric-sort 根据字符串数值比较
-r, --reverse 逆序输出排序结果

示例:
## 查看文件内容
cat test_sort.txt
 
## sort -u 去重
cat test_sort.txt |sort -u

## sort 默认升序
cat test_sort.txt |sort
 
## sort -r 降序
cat test_sort.txt |sort -r

## sort 默认升序,但默认按照字符串比较,会出现2 大于10的情况
cat test_sort.txt |sort
 
## 按照常规数值排序
cat test_sort.txt |sort -g
 
## 按照字符串数值排序
cat test_sort.txt |sort -n

## sort -t -k
cat test_sort.txt |sort -n -t "|" -k 3

awk 命令


 以下为awk内置变量:
          ARGC        命令行参数个数
          FILENAME    当前输入文档的名称
          FNR        当前输入文档的当前记录编号,尤其当有多个输入文档时有用
          NR        输入流的当前记录编号
          NF        当前记录的字段个数
          FS        字段分隔符
          OFS        输出字段分隔符,默认为空格
          ORS        输出记录分隔符,默认为换行符\n
          RS        输入记录分隔符,默认为换行符\n

显示kaikai.txt文档每行的字符长度
awk '{print length()}' kaikai.txt

按字符分割
awk -F"[.:]" '{print $1,$5}' kaikai.txt
echo 10.0.0.7:qwe |awk -F"[.:]" '{print $1,$5}'

输出当前文档的当前行编号,第一个文件两行,第二个文件三行
awk '{print FNR}' kaikai.txt kaiai2.txt

awk将两个文档作为一个整体的输入流,通过NR输入当前行编号:
awk '{print NR}' test1.txt test2.txt

统计所有空白行:
awk '/^$/ {print x+=1}' test.txt

打印总空白行个数
awk '/^$/ {x+=1} END {print x}' kaikai.txt

打印用户的ID号:
awk -F: '$1~/kaikai/ {print $3}' /etc/passwd

if (表达式)
    动作1
else
    动作2
或者if (表达式)  动作1;else 动作2
说明:如果表达式的判断结果为真则执行动作1,否则执行动作2。
示例:(判断boot分区可用容量小于20M时报警,否则显示OK)
df | grep "boot" | awk '{if($4<20000) print "Alart"; else print "OK"}'

1. rand ()        产生0-1之间的浮动类型的随机数
备注:rand产生随机数时需要通过srand()设置一个参数,否则单独的rand()每次删除的随机数都是一样的。
示例:
awk 'BEGIN {print rand(); srand(); print srand()}' test.txt

sed 命令

sed 主要是用来将数据进行选取、替换、删除、新増的命令。我们看看命令的语法:

 sed [选项] '[动作]' 文件名

选项:
-n:一般 sed 命令会把所有数据都输出到屏幕上。如果加入此选项,则只会把经过 sed 命令处理的行输出到屏幕上;
-e: 允许对输入数据应用多条 sed 命令编辑;
-f 脚本文件名:从 sed 脚本中读入 sed 操作。和 awk 命令的 -f 选项非常类似;
-r:在 sed 中支持扩展正则表达式;
-i:用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作;
a \:追加,在当前行后添加一行或多行。当添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;
c \:行替换,用c后面的字符串替换原数据行。当替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结;
i \:插入,在当前行前插入一行或多行。当插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结;
d:删除,删除指定的行;
P:打印,输出指定的行;
s:字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和Vim中的替换格式类似);

文件的第二行
sed -n "2p" kaikai.txt
全局替换123---pig
sed -i 's/123/pig/' kaikai.txt
第二行插入kaikai
sed -i '2i kaikai' kaikai.txt

第 2~5 行删除
sed -i '2,5d' kaikai.txt
要删除第 3 到最后一行
sed '3,$d' kaikai.txt

第二行后(亦即是加在第三行)加上
sed  -i '2a drink tea' kaikai.txt
第二行前加上
sed -i '2i drink tea' kaikai.txt

将第2-5行的内容取代成为『No 2-5 number』呢?
sed '2,5c No 2-5 number' kaikai.txt

所有包含root的行,其他行输出
sed -n '5,7p' kaikai.txt 

变量

修改变量为只读
使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变,也不能被删除:
readonly name

删除变量
使用unset命令可以删除变量,但不能删除只读变量:
unset name

位置参数
运行Shell脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 $n 的形式来接收。例如: $1 表示第一个参数, $2 表示第二个参数,依次类推。
如果参数个数达到或者超过了10个,那么就得用 ${n} 的形式来接收了,例如: ${10} 、 ${23} 。 {} 的作用是为了帮助解释器识别参数的边界,这跟使用变量时加 {} 是一样的效果。

整数型
在Shell中所有的变量默认都是字符串型。也就是说,如果不手工指定变量的类型,那么所有的数值都是不能进行运算的:
如果想要进行数学运算,可以使用“$((运算式))”或“$[运算式]”方式运算:


除了位置参数以外,Shell中还有一些特殊变量,这些特殊变量描述了传入参数的某些信息:
$0:当前脚本的文件名。
$n:n是一个数字,表示第几个参数。
$#:传递给脚本或函数的参数个数。
$*:传递给脚本或函数的所有参数。当被双引号""包含时,会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
$@:传递给脚本或函数的所有参数。当被双引号""包含时,仍然将每个参数都看作一份数据,彼此之间是独立的。。
$?:上个命令的退出状态,或函数的返回值。
$$:当前Shell的进程ID。对于Shell脚本,就是这些脚本所在的进程ID。
为CN生成一个随机的字母数字标识符,其中16个字符用于CN,一个用于服务器名称
head /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1
head /dev/random | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1

数组循环

while getopts 's:' opt; do
    case $opt in
        s)  project_name="$OPTARG";;
        \?) echo "123"                ;;
    esac
done


days=("$project_name")
echo $days
for port1 in $days;
do
  project_port1=`echo ${port1} |awk -F':' '{print $1}'`
  nodePort1=`echo ${port1} |awk -F':' '{print $2}'`
  echo $project_port1 $nodePort1
done

一、for循环语句

循环体: do…done之间的内容

continue:继续;表示循环体内下面的代码不执行,重新开始下一次循环
break:打断;马上停止执行本次循环,执行循环体后面的代码
exit:表示直接跳出程序

二、while循环语句

特点:条件为真就进入循环;条件为假就退出循环

三、until循环

until语句 :提供循环执行,它与while循环相反, until循环将反复执行直到条件为真就结束循环,而while循环条件为假就结束循环
特点:条件为假就进入循环;条件为真就退出循环

四、case语句

说明:pattern表示需要匹配的模式

case var in 定义变量;var代表是变量名
pattern 1) 模式1;用 | 分割多个模式,相当于or
command1 需要执行的语句
;; 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
) default,不满足以上模式,默认执行)下面的语句
command4
;;
esac esac表示case语句结束

五、随机数和随机字符串

为CN生成一个随机的字母数字标识符,其中16个字符用于CN,一个用于服务器名称
head /dev/urandom | tr -dc ‘a-zA-Z0-9’ | fold -w 16 | head -n 1
head /dev/random | tr -dc ‘a-zA-Z0-9’ | fold -w 16 | head -n 1

打印一个随机数
echo $RANDOM
查看系统上一次生成的随机数
set|grep RANDOM
RANDOM=28325

产生0~1之间的随机数
echo $[$RANDOM%2]

产生0~2之间的随机数
echo $[$RANDOM%3]

产生0~3之间的随机数
echo $[$RANDOM%4]

产生0~9内的随机数
echo $[$RANDOM%10]

产生0~100内的随机数
echo $[$RANDOM%101]


产生50-100之内的随机数
echo $[$RANDOM%51+50]

产生三位数的随机数
echo $[$RANDOM%900+100

猜你喜欢

转载自blog.csdn.net/kaikai136412162/article/details/109308179