Shell学习笔记

1 篇文章 0 订阅
1 篇文章 0 订阅

Shell学习笔记

1.shell中输入输出重定向,>、>>、<、<<、>/dev/null、2>&1、<<end、<<EOF等

> :覆盖
>>:追加
https://blog.csdn.net/qq_31073871/article/details/80810306?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&utm_relevant_index=2

^a  :以a开头,前边不能加输出行号(-n)
a$  :以a结尾,前边可以加输出行号(-n)



文件描述符

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:

类型文件描述符默认情况对应文件句柄位置
标准输入(standard input)0从键盘获得输入/proc/self/fd/0
标准输出(standard output)1输出到屏幕(即控制台)/proc/self/fd/1
错误输出(error output)2输出到屏幕(即控制台)/proc/self/fd/2

所以我们平时在执行shell命令中,都默认是从键盘获得输入,并且将结果输出到控制台上。但是我们可以通过更改文件描述符默认的指向,从而实现输入输出的重定向。比如我们将1指向文件,那么标准的输出就会输出到文件中。

输出重定向

输出重定向的使用方式很简单,基本的一些命令如下:

命令介绍
command >filename把标准输出重定向到新文件中
command 1>filename同上
command >>filename把标准输出追加到文件中
command 1>>filename同上
command 2>filename把标准错误重定向到新文件中
command 2>>filename把标准错误追加到新文件中
我们使用>或者>>对输出进行重定向。符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,符号的右边可以是一个文件,也可以是一个输出设备。当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。但是当使用>>进行追加时,则不会删除原来已经存在的文件。







cat:查看文件的内容、连接文件、创建一个或多个文件和[重定向](https://so.csdn.net/so/search?q=重定向&spm=1001.2101.3001.7020)输出到终端或文件  用法:cat [选项] [文件]

\1. $ cat hello.txt

显示hello.txt文本文件中的内容

 

\2. $ cat -n file

-n选项,可以显示文件的内容和行号

 

\3. $ cat -b file

-b选项,与-n类似,但只标识非空白行的行号(空白行仍显示)

 

\4. $ cat -e file

-e选项,将在每一行的末尾显示“$”字符,在需要将多行内容转换成一行时非常有用。

 

\5. $ cat

只输入cat命令的话,它只是接收标准输入的内容并在标准输出中显示,所以在输入一行并按回车后会在接下来的一行显示相同的内容。



如:$ cat

hello world!

hello world!

$

重定向的话:

$ cat >hello

hello world!

​       (ctrl+D组合键退出,输入的内容 hello world! 会写入到文件hello中)

$ cat hello

hello world!

$

重定向操作符有两个: >和>>,前者是内容覆盖,后者是在文件的最后追加。

 

\6. 连接多个文件的内容到一个新文件

$ cat test test1 > test2

$ cat test2

结果将显示test和test1中的内容。

shell变量

1.本地变量

变量被单引号和双引号引起来的区别:单引号直接输出,单引号里面是啥会原字符串输出,双引号先解析里面的内容然后再输出。

2.全局变量(当前系统下所有环境都生效的变量)

使用env可以查看当前系统下所有的全局变量
env |grep 变量   查看全局变量的值
定义方式:
方法一:  变量=值
  export   变量
方法二:export   变量=值(最常用)

3.内置变量(bash内部直接定义好的特殊参数,我们可以直接拿过来用)。

man  bash   查看内置变量
$0  获取当前脚本文件名
$n  获取当前执行脚本的第n个参数值,n大于10,用${10}
$?  获取当前脚本上一条命令的返回值,执行成功返回0,执行失败非0
$#  获取当前脚本参数总个数
## 精确截取
格式:${变量名:起始位置:截取长度}   注意:第一个位置从0开始
echo  ${file:0-8,3}  从倒数第八个开始截取3个字符。

默认值

v a r : − s t r i n g , {var:-string}, var:string,{var:+string}, v a r : = s t r i n g , {var:=string}, var:=string,{var:?string}

1.  ${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。

2. ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)

3. ${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

命令变量

( ) 和 反 引 号 推 荐 使 用 ()和反引号 推荐使用 ()使()使用命令变量。

删除变量

unset 变量名

第二章 shell核心知识

2.1.1测试语句

应用场景

判断条件是否成立

语句格式

A test 条件表达式

[root@zh ~]# test 1 = 1
[root@zh ~]# echo $?
0

B 【 条件表达式 】(推荐)

[root@zh ~]# [ 1 = 1 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 = 2 ]
[root@zh ~]# echo $?
1

注意:[]和条件表达式之间有空格隔开,=两边有空格

2.1.2 条件表达式

逻辑表达式

逻辑表达式常用于多个条件之间
常用的逻辑符号 && 和 ||

[root@zh ~]# [ 1 = 1 ] && echo "条件成立"
条件成立
[root@zh ~]# [ 1 = 2 ] && echo "条件成立"
[root@zh ~]# [ 1 = 2 ] ||  echo "条件不成立"
条件不成立

文件表达式

-f 是否是个文件

[root@zh ~]# [ -f a.sh ] && cat a.sh

-d 是否是个目录

#判断是否有backup这个目录,如果没有这个目录就创建该目录
[root@zh ~]# [ -d backup ] ||  mkdir backup
[root@zh ~]# ls
apache-maven-3.3.9  appconf.conf  a.sh  backuo  backup  b.sh  dumplog.sh  jdk1.8.0_11  read.sh  test.txt

-x 是否有执行权限

[root@zh ~]# [ -x a.sh ] && ./a.sh
else

数值表达式

-gt -lt -eq -ne -le -ge
注意:生产中ne和eq使用的频率较高

[root@zh ~]# [ 1 -eq 2 ]
[root@zh ~]# echo $?
1
[root@zh ~]# [ 2 -eq 2 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 -ne 2 ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ 1 -le 2 ]
[root@zh ~]# echo $?
0

字符串表达式

字符串内容是否一致

一致 ==
不一致 !=

[root@zh ~]# [ aaa == aaa ]
[root@zh ~]# echo $?
0
[root@zh ~]# [ aaa == bbb ]
[root@zh ~]# echo $?
1

2.1.3 计算表达式

计算格式
格式一:$(())
注意:括号里面的空格没事

[root@zh ~]# echo $((1+3))
4

格式二:let 变量名a=变量名a+1

[root@zh ~]# a=1
[root@zh ~]# let j=a+4
[root@zh ~]# echo $j
5
[root@zh ~]# let j= a + 4
-bash: let: j=: syntax error: operand expected (error token is "=")

注意:对于let表达式必须是个整体,不能有空格

2.1.4 数组操作

数组简介

bash支持一维数组,不支持多维数据,并且没有限定数组的大小。数组元素的下标从零开始计算。获取数组元素要利用下标,下标可以是整数或者表达式,其值应该大于或者等于0

定义格式

array_name=(val1…valn)
值之间使用空格进行隔开

#单行定义
[root@zh ~]# arr1=(a b c)
#多行定义
[root@zh ~]# arr2=(
> q
> e
> )
#单元素定义
[root@zh ~]# arr3[1]=nihao
[root@zh ~]# arr3[2]=d
[root@zh ~]# echo ${#arr3[@]}
2
[root@zh ~]# echo ${!arr3[@]}
1 2

信息查看

数组获取方式

查看内容
[root@zh ~]# echo ${arr1[0]}
a
[root@zh ~]# echo ${arr1[1]}
b
[root@zh ~]# echo ${arr1[*]}
a b c
[root@zh ~]# echo ${arr1[@]}
a b c
获取下标
[root@zh ~]# echo ${!arr1[@]}
0 1 2
获取数组长度
[root@zh ~]# echo ${#arr1[@]}
3
[root@zh ~]# echo ${#arr2[@]}
2

增删改

增
[root@zh ~]# arr3[1]=nihao
[root@zh ~]# arr3[2]=d
获取元素
[root@zh ~]#  arr3[12]=sdsddgfgfhghgjhkkj
[root@zh ~]# echo ${arr3[11]}

[root@zh ~]# echo ${arr3[12]}
sdsddgfgfhghgjhkkj
[root@zh ~]# echo ${arr3[12]:2:4}
sddg

改
元素整体替换
[root@zh ~]#  arr3[12]=gaile
[root@zh ~]# echo ${arr3[12]}
gaile
元素部分替换
[root@zh ~]# echo ${arr3[12]/ai/haha}
ghahale     #并没有真正修改
[root@zh ~]# echo ${arr3[12]}
gaile

删除
部分删除
[root@zh ~]# unset arr3[12]
[root@zh ~]# echo ${arr3[12]}

整体删除
[root@zh ~]# echo ${arr1[@]}
a b c
[root@zh ~]# unset arr1
[root@zh ~]# echo ${arr1[@]}

重定向

将左侧内容以覆盖的方式输出到右侧文件中。

将左侧内容以追加的方式输出到右侧文件中。

管道符 |

信息传递使用的

使用格式

命令1 | 命令2 将管道符左侧的内容传递到管道符右侧的命令去使用

其他符号

& 将一个命令从前台转移到后台去执行。

使用格式:

命令 &
后台展示 &

信息符号

2 错误信息
1 正确信息
2>&1 所有信息

特殊设备

/dev/null 黑洞,将一些无用信息输出到其中丢弃
/dev/zero 写入它的输出会丢失不见 ,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,像临时交换文件

简单流程控制

if语句

if [ 条件 ]
then
指令
fi

if [ 条件 ]
then
指令1
else
指令2
fi

#!/bin/bash
if [ $1 == "nan" ]
then
  echo  "性别男"
else
  echo  "性别女"
fi

if [ 条件 ]
then
指令1
elif [ 条件 ]
then
指令2
else
指令3
fi

#!/bin/bash
if [ "$1" == "start"  ]
then
  echo "服务启动中"
elif [ "$1" == "stop" ]
then
  echo "服务关闭中"
elif [ "$1" == "restart"  ]
then
  echo "服务重启中"
else
  echo  "脚本$0的使用方式:/bin/bash $0 [ start | stop |restart ]"
fi

case语句

case 变量 in
值1)
echo 1
;;
值2)
echo 2
;;
值3)
echo 10
;;
*)
echo else
;;
esac

注意:分号不能少

#/bin/bash
case $1 in
   "start")
       echo  "服务启动中"
       ;;
   "stop")
       echo  "服务停止中"
       ;;
   "restart")
       echo  "服务重启中"
       ;;
   *)
      echo  "脚本$0的使用方式:/bin/bash $0 [ start | stop |restart ]"
      ;;
esac

循环语句

1)for语句
for i  in $(ls /root)
do 
  echo $i
done
2)while语句
#!/bin/bash
a=2
while [ $a -lt 5 ] 
do
  echo $a
  a=$(($a+1))
done
3)until语句

只要条件不成立,就一直运行下去

#!/bin/bash
a=1
until [ $a -eq 5 ]
do
  echo $a
  a=$(($a+1))
done

循环退出

break 跳出所有循环
#!/bin/bash
# 脚本进入死循环,直到用户输入的数字大于5
while :
do
 echo -n "请输入您的数字,最好在1-5之间"
 read anum
 case $anum in 
   1|2|3|4|5)
     echo  "您输入的数字为:$anum"
     ;;
   *)
     echo "您输入的数字不在范围内,退出"
     break
     ;;
 esac
done

while : 表示死循环

break n 跳出第n个循环 跳出嵌套循环
#!/bin/bash
#break n 演示
for var1 in {1..5}
do
  for var2 in {0..4}
  do
    if [ $var1 -eq 2 -a $var2 -eq 0  ]
    then
       break 2
    else 
       echo " $var1 $var2 "
    fi
  done
done

-a 就是&&意思,两个条件同时满足才往下执行
演示结果:

[root@zh ~]# /bin/bash breakn.sh 
 1 0 
 1 1 
 1 2 
 1 3 
 1 4
continue 跳出当前循环
#!/bin/bash
while :
do
 echo -n "请输入您的数字,最好在1-5之间"
 read anum
 case $anum in 
   1|2|3|4|5)
     echo  "您输入的数字为:$anum"
     ;;
   *)
     continue
     echo "您输入的数字不在范围内,退出"
     ;;
 esac
done

演示结果:

[root@zh ~]# /bin/bash continue.sh 
请输入您的数字,最好在1-5之间1
您输入的数字为:1
请输入您的数字,最好在1-5之间2
您输入的数字为:2
请输入您的数字,最好在1-5之间3
您输入的数字为:3
请输入您的数字,最好在1-5之间4
您输入的数字为:4
请输入您的数字,最好在1-5之间5
您输入的数字为:5
请输入您的数字,最好在1-5之间6
请输入您的数字,最好在1-5之间^C
[root@zh ~]#
exit 退出程序
#!/bin/bash
#break n 演示
for var1 in {1..5}
do
  for var2 in {0..4}
  do
    if [ $var1 -eq 2 -a $var2 -eq 0  ]
    then
       exit
    else 
       echo " $var1 $var2 "
    fi
  done
done

复杂流程控制语句

函数

函数样式
简单函数

函数名(){函数体}

[root@zh ~]# cat simple-fun.sh 
#!/bin/bash
#简单函数定义和调用
diaoyong(){

 echo "我是周浩"
}

diaoyong
[root@zh ~]# /bin/bash simple-fun.sh 
我是周浩
传参函数

函数名(){
函数体 $n
}

[root@zh ~]# cat chuancan.sh 
#!/bin/bash
#传参函数的定义和调用
chuancan(){
   arg=$1
   echo "你好,我是"$arg
}

chuancan aaa
chuancan bbb
[root@zh ~]# /bin/bash chuancan.sh
你好,我是aaa
你好,我是bbb
脚本传参 函数调用
[root@zh ~]# cat jbcc.sh 
#!/bin/bash
#脚本函数的定义和调用
chuancan(){
   xingming=$1
   echo "你好,我是"$xingming
}

chuancan $1
[root@zh ~]# /bin/bash jbcc.sh zh
你好,我是zh
脚本传参 生产中用
#!/bin/bash
#脚本函数的定义和调用  生产中用的方式 使用局部变量的方式传参
arg=$1
chuancan(){
   xingming=$1
   echo "你好,我是"$xingming
}

chuancan $arg

shell常用的命令

grep

grep [参数] [关键字] 【文件名】
-c 只输出匹配行的计数
-n 显示匹配行及行号
-v 取反,显示不匹配行的内容
-i 忽略大小写
-r 递归获取内容

[root@zh ~]# grep -rn nihao /root/*
/root/file.txt:1:nihao
/root/file.txt:2:nihao
/root/test:1:aaa nihao

egrep 将带有nihao或者AAA的行显示出来,支持正则

[root@zh ~]# egrep 'nihao|AAA' test
aaa nihao
AAA   DFDF

sed

格式详解

sed [参数] ‘<匹配条件> [动作]’ 【文件名】

参数详解:

-i 表示对文件进行编辑
-n 取消静默输出

匹配条件

关键字匹配格式:
‘/关键字/’
注意:隔离符号/可以替换成@、#、!等符号
根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。

动作详解

a 在匹配到内容的下一行追加内容
i 在匹配到内容的当前行追加内容
d 删除匹配到的内容
s 替换匹配到的内容
p 查看指定内容

[root@zh ~]# sed -n '/SED4/p' sed.txt 
nihao  SED4  SED5 SED6
[root@zh ~]# cat sed.txt 
nihao  sed1  sed2 sed3
nihao  sed4  sed5 sed6
nihao  sed7  sed8 sed9
[root@zh ~]# sed '3p' sed.txt 
nihao  sed1  sed2 sed3
nihao  sed4  sed5 sed6
nihao  sed7  sed8 sed9
nihao  sed7  sed8 sed9
sed默认会将原文全部显示出来然后再将想要的显示出来。
[root@zh ~]# sed -n '3p' sed.txt 
nihao  sed7  sed8 sed9
使用-n参数取消静默输出,这样原文就不会显示了。

替换内容
样式一、
sed -i ‘行号s#原内容#替换内容#列号’ 文件名

注意:行号不写表示所有行,列好不写表示第一个匹配到的列。

[root@zh ~]# sed 's#sed#SED#' sed.txt 
nihao  SED1  sed2 sed3
nihao  SED4  sed5 sed6
nihao  SED7  sed8 sed9
不加-i表示对文件进行模拟操作
[root@zh ~]# cat sed.txt 
nihao  sed1  sed2 sed3
nihao  sed4  sed5 sed6
nihao  sed7  sed8 sed9
[root@zh ~]# sed -i 's#sed#SED#' sed.txt 
[root@zh ~]# cat sed.txt 
nihao  SED1  sed2 sed3
nihao  SED4  sed5 sed6
nihao  SED7  sed8 sed9

样式二、
sed -i ‘s#原内容#替换内容#g’ 文件名
g 表示所有匹配到的 样式二表示全文替换

[root@zh ~]# sed -i 's#sed#SED#g' sed.txt 
[root@zh ~]# cat sed.txt 
nihao  SED1  SED2 SED3
nihao  SED4  SED5 SED6
nihao  SED7  SED8 SED9

增加实践
格式
sed -i ‘行号a\增加的内容’ 文件名
注意:如果增加多行,可以在行号处写个范围值,彼此之间用逗号隔开,例如:
sed -i ‘1,3a\增加内容’ 文件名

[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	nihao  SED4  SED5 SED6
     3	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '2a\add-1' sed.txt
[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	nihao  SED4  SED5 SED6
     3	add-1
     4	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '1,3a\add-3' sed.txt
[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	add-3
     3	nihao  SED4  SED5 SED6
     4	add-3
     5	add-1
     6	add-3
     7	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '/SED1/a\add-3' sed.txt 在匹配到内容后面增加
[root@zh ~]# cat -n sed.txt 
     1	nihao  SED1  SED2 SED3
     2	add-3
     3	add-3
     4	nihao  SED4  SED5 SED6
     5	add-3
     6	add-1
     7	add-3
     8	nihao  SED7  SED8 SED9

在当前行增加使用-i参数 -a在匹配到的下一行增加,-i用法同-a

[root@zh ~]# sed -i '1i\insert1' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	add-3
     5	nihao  SED4  SED5 SED6
     6	add-3
     7	add-1
     8	add-3
     9	nihao  SED7  SED8 SED9

删除演示

sed -i ‘行号d’ 文件名
如果要删除多行,可以使用行号之间用逗号隔开,如 sed -i ‘1,3d’ 文件名

[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	add-3
     5	nihao  SED4  SED5 SED6
     6	add-3
     7	add-1
     8	add-3
     9	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '8d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	add-3
     5	nihao  SED4  SED5 SED6
     6	add-3
     7	add-1
     8	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '4,7d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	add-3
     4	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '/add-3/d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1
     2	nihao  SED1  SED2 SED3
     3	nihao  SED7  SED8 SED9
[root@zh ~]# sed -i '/SED/d' sed.txt 
[root@zh ~]# cat -n sed.txt 
     1	insert1

awk

awk是一个功能强大的文档编辑工具,不仅可以以行为单位处理文件还可以以列为单位处理文件。以及某些流程语句。

格式详解

awk [参数] ‘[动作]’ 文件名

#### 常见参数:

-F 指定列的分隔符

[root@zh ~]# cat passwd.txt 
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@zh ~]# awk -F ':' '{print $1,$2}' passwd.txt 
dockerroot x
apache x

-f 调用脚本

[root@zh ~]# cat filename 
/nolog/{ print "第" NR "行的内容是:"$0}
[root@zh ~]# awk -f  filename passwd.txt 
第1行的内容是:dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
第2行的内容是:apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

-v 定义变量
命令行方式
传入单值

[root@zh ~]# echo | awk -v var1=100 '{print var1}' 
100

传入多值

[root@zh ~]# echo | awk '{print v1,v2}' v1=100 v2=200
100 200

注意:-v的使用,需要结合|符号才可以。

常见动作:

print 显示内容
$0 显示当前行所有内容
$n 显示当前行的第n列的内容,如果存在多个列,中间使用逗号隔开。

动作组成

BEGIN { 命令} 初始代码块,主要和变量相关

[root@zh ~]# awk -F ':'   'BEGIN{OFS="|"} {print $1,$7}' passwd.txt 
dockerroot|/sbin/nologin
apache|/sbin/nologin

/partern/{命令} 匹配、执行代码块

[root@zh ~]# awk '/awk/' awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6

END {命令} 结束代码块,主要和信息输出有关

[root@zh ~]# awk -F':'   'BEGIN{print "行号 用户 登录bash"} {print NR,$1,$7} END{ print "----------结束了-------------"}' passwd.txt 
行号 用户 登录bash
1 dockerroot /sbin/nologin
2 apache /sbin/nologin
----------结束了-------------
内置变量
NR   行号
NF   输出最后一列的内容
OFS  输出格式的列分隔符,默认空格
FS   输入文件的列分隔符,缺省是连续的空格和Tab
[root@zh ~]# cat awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6

print后面不指定列号,会默认将文件内容全部打印出来。
[root@zh ~]# awk '{ print }' awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
[root@zh ~]# awk '{ print $1,$3 }' awk.txt 
nihao awk2
nihao awk5
#显示出行号
[root@zh ~]# awk '{ print NR,$1,$3 }' awk.txt 
1 nihao awk2
2 nihao awk5
#显示第几行的内容
[root@zh ~]# awk ' NR==1 { print $1,$3 }' awk.txt 
nihao awk2
[root@zh ~]# awk '/awk/' awk.txt 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
awk进阶

匹配当前目录下文件大于200b的文件 if语句

[root@zh ~]# ll |awk   '{ if(($5>200 && /^-/)) print "\n" "文件名称:"  $9 "\t" "文件大小:" $5 "B"}'

文件名称:break.sh	文件大小:258B

文件名称:case.sh	文件大小:285B

文件名称:continue.sh	文件大小:261B

文件名称:dumplog.sh	文件大小:202B

文件名称:duoif.sh	文件大小:261B

循环遍历字符串abcde for语句

[root@zh ~]# echo "abcde" | awk -F '' '{ for(i=1;i<=NF;i++)  print $i }'
a
b
c
d
e

find命令

用法格式

find 路径 参数 关键字

参数详解
-name  按照文件名查找文件
-user  按照文件属主来查看文件
-group 按照文件所属组来查看文件
-type  查找某一类型的文件
诸如:
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l - 符号链接文件
f - 普通文件
-size n(K|M|G]) : [c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-perm 按照文件权限进行查找。
-mtime  查找n天以内或以外修改的文件
-ctime  查找n天以内或以外改变的文件
-atime  查找n天以内或以外访问的文件
-depth  在查找文件时,首先查找当前目录的文件,然后再在其子目录下进行查找。
-mindepth n 在查找文件时,首先查找第n层目录的文件,然后再在其子目录下进行查找
-path "子目录" 在指定的子目录下查找,一般与-prune使用。
-newer 查找比指定文件新的文件。
!: 表示取反
动作详解
-print  默认选项,显示名称。-o -print 表示不仅仅显示目录名,还显示目录里面的文件名。
-ls  显示文件属性
-exec 命令 {} \; 使用命令对查找结果处理,查找结果使用"{}”来表示。

实例:将查找的文件重命名

find /root/ -name "ok" -exec mv {} {}.bak \;
[root@zh ~]# find / -name "ok"
/root/ok
[root@zh backup]# find /root/backup/ -type f 
/root/backup/a.sh
/root/backup/exit.sh
/root/backup/case.sh
[root@zh backup]# find /root/backup/ -type d 
/root/backup/
[root@zh backup]# find /root/backup/ -type f -name "jb*"
/root/backup/jbcc.sh

stat命令可以显示出文件的详细信息
[root@zh backup]# stat b.sh
  File: ‘b.sh’
  Size: 62        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 917520      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-10-06 11:58:23.499491332 +0800
Modify: 2021-09-22 17:36:55.192443316 +0800
Change: 2021-10-06 22:29:49.868751621 +0800
 Birth: -

查找5天内有修改的文件

[root@zh backup]# find /root -mtime -5
/root
/root/.viminfo
/root/file.txt
/root/filename
/root/.bash_history
/root/passwd.txt
/root/ok
/root/sed.txt
/root/backup

#!/bin/bash

base_path=/root/application/xmzt/zyzx/zhouhao/dumpjar
#配置文件路径
#经常需要备份的几个表配置文件
everyday_path=$base_path/everyday.conf
#检修时需要备份的表或者自定义备份表配置文件
self_path=$base_path/selfconf.conf


#日志输出路径
log_path=$base_path/dump.log
#定时备份和定时删除输出路径
cron_log_path=$base_path/dumpcron.log

#手动备份日期 
dd=`date +%Y%m%d_%H%M%S`
# 定时备份日期
dd_cron=`date +%Y%m%d`
#七天前日期
dd7=`date +%Y%m%d -d "-7day"`


#主机名
hostname=rm-b7e6k8h528l5wravi998.mysql.rds.ops.sgepri.sgcc.com.cn
#用户名 
username=dump
#密码 
password=dump@123456
#端口
port=50000
#库名
dbname=pmp


#正确信息打印
loginfo() {
    printf '\033[1;32m[%s]\033[0m %s\n' "$(date +'%F %T')" "$*"
}
#错误信息打印
logerror() {
    printf '\033[1;31m[%s]\033[0m %s\n' "$(date +'%F %T')" "$*"
}



#备份表
back_table(){
 
 file=$1 
 logpath=$2
 argdate=$3
 while read tablename
 do
		sqlcreate="create table ${tablename}_dumpbackup_$3 like  ${tablename};INSERT INTO  ${tablename}_dumpbackup_$3  SELECT * FROM  ${tablename};" 
		mysql -h${hostname}   -P${port} -u${username}  -p${password}  ${dbname} -e "$sqlcreate"
		if [ $? -eq 0 ];then
			echo${tablename}备份成功。。。
			loginfo 表${tablename}备份成功。。。 >> $logpath
		else
			echo${tablename}备份失败!!!
			logerror 表${tablename}备份失败!!! >> $logpath
		fi
 done < $file
 
}



# 删除备份表
drop_table(){
    file=$1
	logpath=$2
	while read tablename
	do
		dropsql="drop table ${tablename}_dumpbackup_$dd7;"
		mysql -h${hostname}   -P${port} -u${username}  -p${password}  ${dbname} -e "$dropsql"
		if [ $? -eq 0 ];then
			loginfo 表${tablename}删除成功。。。 >> $logpath
			echo${tablename}删除成功。。。
		else
			logerror 表${tablename}删除失败!!! >> $logpath
		    echo${tablename}删除失败!!!
		fi
	done <$file
}


case $1 in 
	back)
		back_table $self_path $log_path  $dd  #检修或者平时手动备份的时候使用 
		;;
	drop) 
		drop_table $everyday_path $cron_log_path   #定时删除备份的表  不要自己用
		;;
	cronback)
	    back_table $everyday_path  $cron_log_path $dd_cron  #定时备份常用的表
		;;
	*)
		loginfo "您输入的参数错误,脚本$0的使用方式 /bin/bash $0 [ back | drop | cronback]" 
	        ;;
esac
$#:传入脚本的参数个数;

$0:  脚本自身的名称;  

$1:  传入脚本的第一个参数;

$2:  传入脚本的第二个参数;

$@: 传入脚本的所有参数;

$*:传入脚本的所有参数;

$$:  脚本执行的进程id;

$?:  上一条命令执行后的状态,结果为0表示执行正常,结果为1表示执行异常;

其中$@$*正常情况下一样,当在脚本中将$*加上双引号作为“$*”引用时,此时将输入的所有参数当做一个整体字符串对待。比如输入参数有a b c三个参数,则“$*”表示“a b c”一个字符串。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值