Shell基础

一 、深入理解Shell

1、shell简介

shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户,下图所示用户、shell和操作系统的关系:
Shell就是一种命令解析器,解析用户的命令调用系统内核执行相关的命令

Shell也是一门编程语言,即shell脚本,shell是解释执行的脚本语言,可直接调用linux命令。

一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的

操作系统内核(kernel)与shell是独立的套件,而且都可被替换:
不同的操作系统使用不同的shell;
同一个kernel之上可以使用不同的shell。

常见的shell分为两大主流:

  • sh :Bourns shell(sh) Solaris,hpux默认shell
    Bourns again shell(bash Linux系统默认shell)
  • csh:C shell(csh)
    TC shell(tcsh)

shell命令解析器可以解析我们输入的命令, 翻译成指令区执行
shell编程 [将用户输入的指令进行有机的集合,完成一些任务]
Shell脚本的本质,就是大量shell命令的组合,并写入一个文本文件中!

2、Shell 会话(环境、上下文)

终端登录后,立马就自动运行一个bash会话(上下文空间、环境)
在这个bash会话中输入任何命令,就是运行在这个上下文中了;
环境中通常都有变量,例:

[root :linux1 ~]# a=5
[root :linux1 ~]# echo $a
5

然后在当前bash中再开启一个bash会话(子bash),然后打印$a

[root :linux1 ~]# bash
[root :linux1 ~]# echo $a

[root :linux1 ~]# 

结论: 在bash_1中定义的变量,子bash中访问不到
解决办法:
export x=1000 这样的方式来定义变量
则该变量在当前shell以及所有派生出来的shell中都能访问;

export 将变量的范围作用在所有的子bash中
source 将子bash定义的变量作用在当前bash

二、Shell脚本入门

1、第一个Shell脚本

在命令控制台输入vi helloworld.sh,创建helloworld.sh文件并编辑

#!/bin/bash
echo "helloworld"

注意:脚本以#!/bin/bash开头(指定解析器)

2、脚本的常用执行方式

(1)采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)

  • sh 脚本的路径
    sh /home/doit/datas/helloworld.sh
  • bash 脚本的路径
    bash /home/doit/datas/helloworld.sh

(2)采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)

  • 赋予helloworld.sh 脚本的+x权限:chmod 777 helloworld.sh
    执行:./helloworld.sh

注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。
第二种执行方法,本质是脚本需要自己执行,所以需要执行权限

(3)在当前shell中解析执行脚本文件中的命令

前两种方式,都是在当前shell中开启一个子shell来解析执行脚本中的命令
(脚本中定义的变量,就不会在当前shell中存在,只存在于新起的子shell)

以下2种方式,则是在当前shell中解析执行脚本文件中的命令
(如果脚本中有定义变量,运行完后,就是定义在了当前shell环境中

  • source ./doit.sh
  • . ./doit.sh(doit.sh应在父目录中)

(4)配置系统环境变量执行脚本

将脚本所在的文件夹配置到系统环境变量中,过程:

vi /etc/profile
点击i进入编辑模式
在pash后面加上":脚本所在文件夹路径"(在windows中path用;来结尾,linux中path用:来结尾)
退出并保存 
source /etc/profile  将profile文件的变量作用到当前bash
此时,只要有执行权,在任意目录下都可直接写该脚本的名字执行该脚本 
直接a.sh就可执行

三、shell变量

1、系统变量

set 查看系统中的所有变量,然后用"$变量名"获取变量值
$PWD : 代表当前所在的工作路径
$USER : 代表当前登录的用户名
$? : 代表当一条命令执行后的返回码

2、自定义变量

(1)变量定义

  • 定义变量:变量=值
  • 撤销变量:unset 变量
  • 声明静态变量:readonly变量,注意:不能unset

(2)变量定义规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
  • 等号两侧不能有空格
  • 在bash中,变量默认类型都是字符串类型无法直接进行数值运算
  • 变量的值如果有空格,需要使用双引号或单引号括起来。
A=5            普通的变量          
readonly B=2   只读变量
echo $A        在控制台打印A变量的值       
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
变量的值如果有空格,需要使用双引号或单引号括起来 D="I love banzhang"

(3)变量的取值

有三种方式:

  • $A
  • ${A}
  • “$A”

(4)变量的运算

在bash中,变量默认类型都是字符串类型无法直接进行数值运算

echo 1+2
输出:1+2

要进行运算的语法:

  • $((a+b))
  • $[a+b]

a和b可以是数值,也可以是变量。若a、b变量值有一个不是数值,则将它当0处理。

a=q
b=2
echo $[a+b]
结果:2
echo $((1+2))
输出:3
a=1
b=2
echo $(($a+$b))
输出:3
echo $((a+b))
输出:3

(5)export和source关键字

export name=lisi 将变量的范围作用在所有的子bash中
source ./doit.sh 执行子bash并将子bash定义的变量作用在当前bash

(6)单引号和双引号的区别

  • 现象:单引号里的内容会全部输出,而双引号里的内容会有变化
  • 原因:单引号会将所有特殊字符脱意
# $name 代表引用变量的值
 echo $name is the most handsome man
 结果:tom is the most handsome man
# 双引号中如果有 $name 变量引用,可以正常解析
 echo "$name is the most handsome man"
 结果:tom is the most handsome man
# 单引号中如果有 $name 变量引用,$符号被转义,没有任何特殊含义了,就不是引用变量了
 echo '$name is the most handsome man'
 结果:$name is the most handsome man
# \$ 也是把$符转义,那么 $name也不是变量引用了
 echo "\$name is the most handsome man"
 结果:$name is the most handsome man
# 双引号中,有单引号,这时,单引号不具备转义的功能了,所以$name可以正常解析
 echo "'$name is the most handsome man'"
 结果:'tom is the most handsome man'
# 错误写法,它代表一个空串+中间那一段+空串
 echo ""$name is the most handsome man""
 结果:tom is the most handsome man
# 双引号中需要嵌套双引号,可以把内层双引号用\转义
 echo "\"$name is the most handsome man\""
 结果:"tom is the most handsome man"

(7)``特殊转译

`是tab上面的那个键,可以将包裹的内容转译为执行后的结果,如:

mkdir date:创建一个名为date的文件夹
mkdir `date`:创建一个名为当前日期的文件夹

3、特殊变量

  • $n:写在脚本里,用来接收脚本执行时传入的参数的变量 ,n为数字,$0代表命令本身,$1-$9代表第一到第9个参数,10以上的参数需要用大括号包含,如${10}
vi  param.sh
#!/bin/bash
echo "hello $1 , are you a $2 ?"

[root :linux1 ~]# sh param.sh tom teacher
hello tom , are you a teacher ?
  • $*:写在脚本里,代表传入的所有参数。把所有的参数看成一个整体,以"$1 $2 … $n"的形式输出所有参数
  • $@:写在脚本里,代表传入的所有参数。把每个参数区分对待,以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数
  • $#:写在脚本里,代表传入的参数的个数。
  • $?:执行上一个命令的返回码; 执行成功,返回0,执行失败,返回非0(具体数字由命令决定)
  • $$:当前进程的进程号(PID),即当前脚本执行时生成的进程号
  • $!:后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程的进程号
$* 和$@的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以"$1" "$2" … "$n" 的形式输出所有参数
当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

四、read:控制台输入

语法:read [选项] 变量名

选项:

  • -p(提示语句)
  • -n(字符个数)
  • -t(等待时间,单位为秒)
  • –s(隐藏输入)

例:read –t 30 –p “please input your name: ” NAME
控制台提示:“please input your name:”并让用户输入,用户输入的值会被放到NAME变量中。30秒内用户无操作的话会自动退出。
使用$NAME即可取出用户输入的值。

五、算数运算

有两种方式:

  • $((运算式))或$[运算式]
  • expr 运算式 (这里的运算式需要用空格隔开,相当于是传参的形式)
    y=`expr $x + 10`(注意这里用反引号括起来,说明他是个运算)

+ , - ,\ *, /, % 加,减,乘(注意乘要用转义符),除,取余

$符号功能总结:

  • ${a} 取变量a的值
  • $( ) 取一个命令的执行结果,效果与反引号相同。如$(date)
  • $(( )) 取算术运算表达式的运算结果,效果与 $[ ] 相同。$((1+3))、$[1+3]

六、数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小,数组元素的下标由 0 开始。

1、定义数组

  • Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
    array_name=(value1 value2 … valuen)
    例:my_array=(A B “C” D)
  • 我们也可以使用下标来定义数组:
    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2

2、读取数组

读取数组元素值的一般格式是:
${array_name[index]}

3、获取数组中的所有元素

使用@ 或 * 可以获取数组中的所有元素:
${array_name[*]}
${array_name[@]}

4、获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,在 前面加个#号
${#my_array[*]}
${#my_array[@]}

5、将脚本的输入参数转成一个数组

#!/bin/basharr=($@)echo ${arr[1]}

6、遍历数组

#!/bin/bashfor var in ${arr[@]}
do 
 echo $var
done

七、字符串处理

1、获取字符串长度

${#str}

2、提取子串

语法:

  • ${string:index} :在$string中,从index位置的字符开始提取子串
  • ${string:index:length} :在$string中,从index位置的字符开始提取length长度的子串
echo ${NAME}
 结果:ni hao, ming tian
echo ${NAME:3}
 结果:hao, ming tian
echo ${NAME:3:6}
 结果:hao, m

3、删除子串

语法:

  • ${string#substring} :删除string开头处与substring匹配的最短子串
  • ${string##substring} :删除string开头处与substring匹配的最长子串
  • ${string%substring} :删除string结尾处与substring匹配的最短子串
  • ${string%%substring} :删除string结尾处与substring匹配的最长子串

substring中有*号

echo $another_string
 结果:20091114 Reading Hadoop
echo ${another_string#2*1}
 结果:114 Reading Hadoop
echo ${another_string##2*1}
 结果:4 Reading Hadoop
echo ${another_string%a*p}
 结果:20091114 Reading H
echo ${another_string%%a*p}
 结果:20091114 Re

若不写*号,则只是普通的截掉字串

name=babababababa
echo ${name%ba}
 结果:bababababa
echo ${name%%ba}
 结果:bababababa
echo ${name#ba}
 结果:bababababa
echo ${name##ba}
 结果:bababababa

4、替换子串

语法:

  • ${parameter//pattern/string}
    用string来替换parameter变量中所有匹配的pattern
  • ${parameter/parttern/string}
    从开头开始用string来替换第一个匹配的pattern
  • ${parameter/#parttern/string}
    从开头开始用string来替换第一个匹配的pattern
  • ${parameter/%pattern/string}
    从结尾开始用string来替换第一个匹配的pattern
name=babababababa
echo ${name//ba/ab}
 结果:abababababab
echo ${name/ba/ab}
 结果:abbababababa
echo ${name/#ba/ab}
 结果:abbababababa
echo ${name/%ba/ab}
 结果:bababababaab

八、条件判断

语法:

  • [ 判断表达式 ]
    注意表达式前后要有空格
  • test 判断表达式

测试范围:整数、字符串、文件

1、字符串判断

  • 判断是否相等:
    test str1 == str2
    [ str1 == str2 ]
  • 判断是否不相等:
    test str1 != str2
    [ str1 != str2 ]
  • 判断是否不为空:
    test str1
    [ str1 ]
  • 字符串的长度非零:
    test –n 字符串
    [ -n 字符串 ]
  • 字符串的长度为零:
    test –z 字符串
    [ -z 字符串 ]
    str可以为一个字符串也可以为一个变量,是变量时要用$变量名取值,如:[ $a == $b ]

有时会用到-n -z来判断字符串长度,用到变量是要小心。比较一下两条语句

[monitor@msg7 .monitor]$ if [ -n $b ];then echo yes;else echo no;fi
yes
[monitor@msg7 .monitor]$ if [ -n "$b" ];then echo yes;else echo no;fi
no

$b是未定义一个的变量,但是有引号和没引号,-n给出了不同的答案。所以要记得加引号,才能正确识别字符串变量的长度。

2、整数判断

  • 测试整数是否相等:
    test int1 -eq int2
    [ int1 -eq int2 ]
  • 测试int1是否>=int2:
    test int1 -ge int2
    [ int1 -ge int2 ]
  • 测试int1是否>int2:
    test int1 -gt int2
    [ int1 -gt int2 ]
  • 测试int1是否<=int2:
    test int1 -le int2
    [ int1 -le int2 ]
  • 测试int1是否<int2:
    test int1 -lt int2
    [ int1 -lt int2 ]
  • 测试整数是否不相等:
    test int1 -ne int2
    [ int1 -ne int2 ]

也可比较两个数值类型变量的大小,如:[ $a -ge $b ]

3、文件判断

  • test -d path:指定文件是否目录
    [ -d path ]、[ ! -d path ]、test ! -d path
  • test -f path:指定文件是否常规文件(是不是一个文件)
  • test -L file:文件存在并且是一个链接(ln -s )
  • test -e path:文件是否存在 exists
  • test -r file:指定文件是否可读
  • test -w file:指定文件是否可写
  • test -x file:指定文件是否可执行

4、逻辑组合

多重条件语法:

  • -a :and
  • -o :or
  • && :逻辑与,条件满足,才执行后面的语句
  • ||:逻辑或,条件不满足,才执行后面的语句
[  ! -f  /a  ] && echo "成立" || echo "不成立"
a是个文件夹,这条语句的意思是判断a是否不是一个文件,结果:成立

九、流程控制

1、if判断分支

基本语法:

if  [ 条件判断式 ]
then 
  程序 
fi 

多分枝:

if [ 条件判断式1 ]
    then
        当条件判断式1成立时,执行程序1
elif  [ 条件判断式2 ]  
    then      
        当条件判断式2成立时,执行程序2
...省略更多条件
else
    当所有条件都不成立时,最后执行此程序
fi

注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格

2、case判断分支

基本语法:

  • case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
  • 双分号“;;”表示命令序列结束,相当于java中的break。
  • 最后的“*)”表示默认模式,相当于java中的default。

示例

#!/bin/bash

case $1 in
"1")
        echo "banzhang"
;;

"2")
        echo "cls"
;;
*)
        echo "renyao"
;;
esac

3、for循环

基本语法有两种:

	for (( 初始值;循环控制条件;变量变化 )) 
  		do 
    		程序 
  		done
for N in 1 2 3 
do
	echo $N
donefor N in 1 2 3; do echo $N; donefor N in {1..30}; do echo $N; done

示例:

#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo $s
#!/bin/bash
#打印数字

for i in  $@
    do
      echo "ban zhang love $i "
    done

4、while循环

基本语法:

while [ 条件判断式 ] 
  do 
程序
...
  done

示例:

#!/bin/bash
while [ true ]
 do
   # 间断性的请求一个URL
  curl https://blog.csdn.net/qq_37933018/article/details/119154915 
   # 单位秒
  sleep  10
done 

sleep 10 : 休眠10秒
curl 路径:默认会发送 GET 请求并获取链接内容输出到标准输出

5、let命令

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

let no+=10,let no-=20,分别等同于 let no=no+10,let no=no-20

在循环体中,不能直接写i++(for循环条件中可以)

可以用let i++来实现自增

十、函数(方法)

1、系统自带函数

(1)basename基本语法(返回文件名)

basename [string / pathname] [suffix]

功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。如果pathname没有包含/,则输出`.’(表示当前目录).

选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

(2)dirname基本语法(返回文件路径)

dirname 文件绝对路径

功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

2、自定义函数

函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
重要说明:
在shell中,函数必须先定义,再调用
使用return value来获取函数的返回值
函数在当前shell中执行,可以使用脚本中的变量。
格式如下:

函数名()
{
命令1…..
命令2….
return 返回值变量
}
[ function ] funname [()]
{
  action;
  [return int;]
}

如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

示例:

#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;

3、脚本调试

  • sh -x 脚本名:可以打印出所执行的每一行命令以及当前状态
  • 使用set -x和set +x对脚本进行部分调试
    例:
#!/bin/bash
#文件名: debug.sh
for i in {1..6};
do
set -x
echo $i
set +x
done
echo "Script executed"

在上面的脚本中,只会打印出echo $i的调试信息,因为使用了-x和+x对调试区域进行了限制。

  • sh -n 脚本名 :不执行脚本只是检查语法的模式,将返回所有语法错误
  • sh –v 脚本名:执行并显示脚本内容

十一、高级文本工具

1、cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。并不会改变文件内容

语法:cut [选项参数] filename

选项参数:

  • -d:分隔符,按照指定分隔符分割列。默认分隔符是制表符 \t
  • -f:列号,提取第几列

案例:
(1)数据准备

$ vi cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le

(2)切割cut.txt第一列

$ cut -d " " -f 1 cut.txt 
dong
guan
wo
lai
le

(3)切割cut.txt第二、三列

$ cut -d " " -f 2,3 cut.txt 
shen
zhen
 wo
 lai
 le

(4)在cut.txt文件中切割出guan

$ cat cut.txt | grep "guan" | cut -d " " -f 
guan

grep:在文件中搜寻字串匹配的行并输出。所以是先搜索出有‘guan’的那一列。再分割输出

2、sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

语法:sed [选项参数] ‘命令’ filename

选项参数 :

  • -e:直接在指令列模式上进行sed的动作编辑。[默认值,可省略,但进行多项操作时,需加上,该选项会将其后跟的脚本命令添加到已有的命令中。]
  • -f:脚本命令文件:该选项会将其后文件中的脚本命令添加到已有的命令中。
  • -n:默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
  • -i:直接编辑文件

命令参数:

  • a:新增,a的后面可以接字串,在下一行出现
  • d:删除
  • s/查找内容/替换内容/:查找并替换
  • g:global 全局操作

案例 :
(1)数据准备

$ vi sed.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le

(2)将“mei nv”这个单词插入到sed.txt第二行下,打印。

$ sed '2a mei nv' sed.txt 
dong shen
guan zhen
mei nv
wo  wo
lai  lai

(3)删除sed.txt文件所有包含wo的行

$ sed '/wo/d' sed.txt  #这里的/wo/的意思是搜索wo
dong shen
guan zhen
lai  lai
le  le

(4)将sed.txt文件中wo替换为ni

$ sed 's/wo/ni/g' sed.txt 
dong shen
guan zhen
ni  ni
lai  lai
le  le

注意:‘g’表示global,全部替换
(5)将sed.txt文件中的第二行删除并将wo替换为ni

$ sed -e '2d' -e 's/wo/ni/g' sed.txt 
dong shen
ni  ni
lai  lai
le  le

特别有用的几个用法:

  • 删除文件中的空行
    sed -i ‘/^$/d’ sed.txt
  • 给指定3-5行范围添加注释
    sed -i ‘3,5s/^/#/’ sed.txt
  • 给所有行范围添加注释
    sed -i ‘s/^/#/’ sed.txt
  • 给指定行范围删除注释
    sed -i ‘s/^#//’ sed.txt
  • 在指定模式匹配的行(下)追加一行
    sed ‘/^hi/a\this is appended line’ sed.txt
  • 在指定模式匹配的行(上)追加一行
    sed ‘/^hi/i\this is appended line’ sed.txt

3、awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

语法:awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令

选项参数:

  • -F:指定输入文件折分隔符
  • -v:赋值一个用户定义变量

案例:

#以:分割为列,搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。
awk -F : '/^root/{print $7}' passwd 
#以:分割为列,搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间加“,”号。
awk -F : '/^root/{print $1","$7}' passwd
#以:分割为列,只显示passwd的第一列和第七列,中间加逗号,且在所有行前面添加列名user,shell,在最后一行添加"hunter,/bin/zuishuai"。
awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "hunter,/bin/zuishuai"}' passwd
#以:分割为列,将passwd文件中第3列增加数值1并输出
awk -v i=1 -F: '{print $3+i}' passwd

awk的内置变量

  • FILENAME:当前文件名
  • NR:已读的记录数(正在读取的行的行号)
  • NF:浏览记录的域的个数(正在读取的行的列数)

案例:
(1)数据准备

cat a.txt
1,zs,18
2,ls,18
3,ww,18
4,zs,18,jj

(2)以:分割为列,统计a.txt的文件名,每行的行号,每行的列数

#以:分割为列,统计a.txt的文件名,每行的行号,每行的列数
awk -F: '{print "filename:"  FILENAME ", linenumber:" NR  ",columns:" NF}' a.txt
filename:a.txt, linenumber:1,columns:3
filename:a.txt, linenumber:2,columns:3
filename:a.txt, linenumber:3,columns:3
filename:a.txt, linenumber:4,columns:4

注意:只有匹配了pattern的行才会执行action
BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。

4、sort

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

语法:sort(选项)(参数)

选项:

  • -f 排序时,将小写字母视为大写字母
  • -n 依照数值的大小排序
  • -r 以相反的顺序来排序
  • -t<分隔字符> 设置排序时所用的分隔字符
  • -k 按指定的列进行排序

参数:指定待排序的文件列表

案例:
(1)数据准备

vim sort.txt
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6

(2)按照“:”分割后的第三列倒序排序

$ sort -t : -nrk 3  sort.txt
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6

十二、定时任务调度

Linux中有一个后台服务,可以帮用户做定时的任务调度
这个服务的名称是: crond
crontab -e:打开定时任务文件,编辑你想实现的定时任务(写多个)
crontab -r:移除定时任务(正常是将不想要那行任务注掉)

定时任务编写:
把所有的任务,写入到一个可执行的文件
再在crontab -e里面配置执行任务

crontab -e配置命令格式:

 *    *    *    *    *  /bin/bash  a.sh
分钟  小时  日    月  星期   命令      脚本

示例:

eg:每天4点备份
0      4        *      *     *    cp  -r  /logs   /root/
分     时        日     月    周
eg:每周二至周五,下午6点 的计划任务
0   18       *      *     2-5  (2,3,4,5)
eg:1到10月份,每周二、周五,下午6点的计划任务
0     18       *     1-10  2,5
eg:周一到周五下午,5点半提醒学生15分钟后关机
30   17      *       *     1-5   /usr/bin/wall < /etc/issue
45   17      *       *     1-5  /sbin/shutdown -h now
eg:在每天 18:00至23 :00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh
0,30  18-23  *  *  * /apps/bin/dbcheck.sh

十三、jps查看 java进程

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。

jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.

使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。

$> jps
23991 Jps
23789 BossMain
23651 Resin

比较常用的参数:

  • -q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
  • -m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
  • -l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
  • -v 输出传递给JVM的参数
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值