【b站黑马程序员学习笔记-shell入门编程】

使用root用户创建并执行test2.sh,实现创建一个shelltest用户,并在其家目录中新建文件try.html

一、

[root@localhost ~]# touch test2.sh
[root@localhost ~]# vim test2.sh

在这里插入图片描述
二、添加执行权限并执行

[root@localhost ~]# chmod +x test2.sh
[root@localhost ~]# /bin/bash test2.sh
[root@localhost ~]# ls /home/shelltest/try.html
/home/shelltest/try.html
[root@localhost ~]# 

注意 执行脚本有三种方式:

  • sh解析器执行方式:即利用sh命令执行脚本文件,本质是使用bash解析器运行脚本文件
    语法:sh 脚本文件
  • bash解析器执行方式:利用bash命令执行脚本文件,本质是使用bash解析器运行脚本文件
    语法:bash 脚本文件
  • 仅路径执行方式
    ./脚本文件
    注意:脚本文件自己执行需要具有可执行权限,否则无法执行

变量的学习
变量类型

  • 系统环境变量
  • 自定义变量
  • 特殊符号变量
    系统环境变量:是系统提供的共享变量,是Linux系统加载Shell的配置文件中定义的变量共享给所有Shell程序使用

Shell的配置文件分类
1、全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2、个人配置文件
当前用户/.bash_profile
当前用户./bashrc
一般情况下,我们都是针对全局文件进行操作

查看当前Shell系统环境变量 :env
在这里插入图片描述
查看Shell变量(系统环境变量+自定义变量+函数):set
在这里插入图片描述

[root@localhost ~]# echo $PATH    
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $HISTFILE  //查看存储执行命令文件位置
/root/.bash_history
[root@localhost ~]# echo $LANG //查看系统字符集
en_US.UTF-8
[root@localhost ~]# 

查询变量语法

  • 语法1:直接使用变量名查询
    $var_name

  • 语法2:使用花括号
    ${var_name}
    区别:花括号方式适合拼接字符串

#!/bin/bash
name=lixiaopang
age=18
echo my name is ${name}123

输出结果为my name is lixiaopang123

一、使用变量来输出hello world
在这里插入图片描述

注意:双引号会识别变量,但是单引号不可以,也就是说这里可以写成"$str",最后的结果也是正确的。而且双引号可以实现转义,比如识别*为乘号
如果想获取字符串长度,则可以写成 $ {字符串变量名}

二、定义一个变量。输出当前时间,要求格式为“年-月-日 时:分:秒”

  1 #!/bin/bash
  2 shijian=`date +'%F %T'`
  3 echo $shijian

注意:反引号`(esc下面的那个键),是在脚本中执行指令并且把执行结果赋值给变量的时候使用的

三、设置一个只读变量a并设其值为10,随后设置为只读变量,再去尝试重新赋值
注意:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

  1 #!bin/bash
  2 a = 10
  3 readonly a
  4 a=20
  5 echo $a

尝试运行脚本时出现了这样的错误提示:

[liyufeng@localhost code]$ ./test5.sh
bash: ./test5.sh: bin/bash: 坏的解释器: 没有那个文件或目录
[liyufeng@localhost code]$ 

发现是自己写漏了一个/,应该是 1 #!/bin/bash

[liyufeng@localhost code]$ ./test5.sh
./test5.sh:行4: a: 只读变量
10
[liyufeng@localhost code]$ 

运行后发现只读变量还是10,并没有发生改变

四、接收用户输入
语法:
read -p 提示信息 变量名
案例:编写一个脚本,要求执行后提示用户输入文件名(路径),然后自动为用户创建该文件

 1 #!/bin/bash
  2 read -p '请输入需要创建的文件路径:' filepath
  3 touch $filepath
  4 echo '文件创建成功!'
  5 ls -l $filepath

这里涉及到中英文的切换,默认的切换键是windows+空格键

[liyufeng@localhost code]$ ./test6.sh
请输入需要创建的文件路径:/home/liyufeng/lixiaopang/code/20220427.txt
文件创建成功!
-rw-rw-r--. 1 liyufeng liyufeng 0 427 01:26 /home/liyufeng/lixiaopang/code/20220427.txt
[liyufeng@localhost code]$ 

可以看到,文件已创建成功
在这里插入图片描述

五、删除变量
语法:
unset 变量名

  1 #!/bin/bash
  2 b=20
  3 echo $b
  4 unset b
  5 echo $b
[liyufeng@localhost code]$ ./test7.sh
20

[liyufeng@localhost code]$ 

六、全局变量
父子Shell环境:在A.sh脚本文件中执行了B.sh脚本文件,那么A.sh就是父Shell环境,B.sh就是子Shell环境
在当前脚本中定义全局变量,那么这个全局变量在当前Shell环境和子Shell环境中都可以使用
语法:
ecport 变量名
A.sh内容:

#!/bin/bash
VAR4="itheima"
export VAR4
sh B.sh

B.sh内容:

#!/bin/bash
echo "B.sh中输出变量VAR4,值为:${VAR4}"

执行A.sh

[root@localhost studycode]# ./A.sh
B.sh中输出变量VAR4,值为:itheima
[root@localhost studycode]# 

七、特殊变量

  • $n:用于接收脚本文件执行时传入的参数
    n为任意数字,$0用于获取当前脚本。$1~$9代表获取第1到第9个参数,10及以上的参数需要用大括号包含,如{11}

创建test7.sh文件,并在脚本文件内部执行:打印脚本文件名字,第一个输入参数,第二个输入参数,第十个输入参数

#!/bin/bash
echo "当前脚本文件名称:$0"
echo "第一个输入参数:$1"
echo "第二个输入参数:$2"
echo "第十个输入参数:${10}"
[root@localhost studycode]# sh test7.sh t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
当前脚本文件名称:test7.sh
第一个输入参数:t1
第二个输入参数:t2
第十个输入参数:t10
[root@localhost studycode]# 
  • $n:获取所有输入参数个数,常用于循环

在test7.sh中输出输入参数个数

#!/bin/bash
echo "所有输入参数个数:$#"
[root@localhost studycode]# sh test7.sh t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
所有输入参数个数:10
[root@localhost studycode]# 
  • $ *和$@

如果不用双引号括起来的话,功能是一样的,即获取所有输入参数,格式为$1 $2
如果使用双引号"括起来的话
$ *:把所有的参数看成一个整体,把所有参数拼接成一个字符串,格式为:“$1 $2 … $n”
$ @:把每个参数区分对待,格式为:“$1” “$2” … “n”
使用循环打印所有输入参数可以看出区别

#!/bin/bash
echo '使用$*直接输出:'$*
echo '使用$@直接输出:'$@
echo '循环遍历输出$*所有参数'
for item in "$*"
do
  echo $item
done
echo '循环遍历输出$@所有参数'
for item in "$@"
do
  echo $item
done
[root@localhost studycode]# sh test7.sh t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
使用$*直接输出:t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
使用$@直接输出:t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
循环遍历输出$*所有参数
t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
循环遍历输出$@所有参数
t1
t2
t3
t4
t5
t6
t7
t8
t9
t10
[root@localhost studycode]# 
  • $?:用于获取最后一次执行的命令的返回状态。一般来说,如果返回0,证明上一个命令执行成功,如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不成功
[root@localhost studycode]# echo "hello"
hello
[root@localhost studycode]# echo $?
0
[root@localhost studycode]# ee
bash: ee: command not found...
[root@localhost studycode]# echo $?
127
[root@localhost studycode]# 
  • $$:用于获取当前Shell环境进程编号
[root@localhost studycode]# ps -aux|grep bash
root        730  0.0  0.0 115412   740 ?        S    May14   0:01 /bin/bash /usr/sbin/ksmtuned
liyufeng   2409  0.0  0.0  72472    48 ?        Ss   May14   0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root      66125  0.0  0.1 116460  1428 pts/0    Ss+  04:26   0:00 -bash
root      88043  0.0  0.2 116328  2904 pts/2    Ss   06:18   0:00 -bash
root     104919  0.0  0.0 112816   972 pts/2    S+   07:45   0:00 grep --color=auto bash
[root@localhost studycode]# echo $$
88043
[root@localhost studycode]# 

八、自定义系统环境变量
当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量,供给所有Shell程序使用。所以以后只要是所有Shell程序或命令使用的变量就可以在这个文件进行定义
案例:
编辑/etc/profile全局配置文件,增加命令:定义变量VAR1=VAR1,并导出为环境变量

export VAR1=VAR1

重载配置文件,语法:source /etc/profile
在Shell环境中读取系统环境变量

九、字符串变量的拼接

  • 无符号拼接
  • 双引号拼接
  • 混合拼接
[root@localhost studycode]# var1=abc
[root@localhost studycode]# var2="hello world"
[root@localhost studycode]# var3=${var1}${var2}//无符号拼接
[root@localhost studycode]# echo $var3
abchello world
[root@localhost studycode]# var3="${var1}${var2}"//双引号拼接
[root@localhost studycode]# echo $var3
abchello world
[root@localhost studycode]# var3=${var1}"&"${var2}//混合拼接
[root@localhost studycode]# echo $var3
abc&hello world
[root@localhost studycode]# var3="${var1} ${var2}"//双引号拼接中间可以有空格
[root@localhost studycode]# echo $var3
abc hello world
[root@localhost studycode]# 

十、字符串截取

格式说明
${string: start :length}从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符,start从0开始
${string: start}从 string 字符串的左边第 start 个字符开始截取,直到最后
${string: 0-start :length}从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符,这里start从1开始
${string: 0-start}从 string 字符串的右边第 start 个字符开始截取,直到最后
${string#*chars}从 string 字符串左边开始第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符
${string##*chars}从 string 字符串左边开始最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符
${string%chars*}从 string 字符串右边开始第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符
${string%%chars*}从 string 字符串右边开始最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符

1、从左侧第0个开始,向右截取2个字符

[root@localhost studycode]# var1="welcome to itheima"
[root@localhost studycode]# echo ${var1:0:2}
we

2、从左侧第11个开始,向右截取所有字符

[root@localhost studycode]# echo ${var1:11}
itheima

3、从右侧第5个开始,向右截取2个字符

[root@localhost studycode]# echo ${var1:0-5:2}
he

4、截取左边开始第一次出现字符e右边的所有字符

[root@localhost studycode]# echo ${var1#*e}
lcome to itheima

5、截取左边开始最后一次出现字符e右边的所有字符

[root@localhost studycode]# echo ${var1##*e}
ima

6、截取右边开始第一次出现字符e右边的所有字符

[root@localhost studycode]# echo ${var1%e*}
welcome to ith

7、截取右边开始最后一次出现字符e右边的所有字符

[root@localhost studycode]# echo ${var1%%e*}
w

Shell数组
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小
定义格式

array_name=(item1 item2 ...)//方式一
array_name=[索引下标1]=item1 [索引下标2]=item2 ...)//方式二

要注意=两边不能有空格

1、定义一个数组

[root@localhost studycode]# nums=(3 14 15 9 26 5)

2、通过下标获取元素值 ${array_name[index]}

[root@localhost studycode]# echo ${nums[1]}
14

3、获取值的同时赋值给其他变量

[root@localhost studycode]# item=${nums[0]}
[root@localhost studycode]# echo $item
3

4、使用@ 或 * 获取数组中的所有元素
${arrayname[*]}
${arrayname[@]}

[root@localhost studycode]# echo ${nums[*]}
3 14 15 9 26 5
[root@localhost studycode]# echo ${nums[@]}
3 14 15 9 26 5

5、获取数组的长度
${#arrayname[*]}
${#arrayname[@]}

[root@localhost studycode]# echo ${#nums[*]}
6
[root@localhost studycode]# echo ${#nums[@]}
6

6、数组的拼接

[root@localhost studycode]# num2=(3 5)
[root@localhost studycode]# num3=(${nums[*]} ${num2[*]})
[root@localhost studycode]# echo ${num3[*]}
3 14 15 9 26 5 3 5

7、删除数组

[root@localhost studycode]# unset num3

条件判断语句
语法格式
语法一:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

语法二:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for循环
语法一:

for var in item1 item2 ... itemN
do
  命令1
  命令2
  ...
done

语法二:

for var in {start..end}
do
  命令
done

语法三:

for((i=start;i<=end:i++))
do
  命令
done

运算符
一、算数运算符

  1 #!/bin/bash
  2 a=10
  3 b=20
  4 echo "a=$a"
  5 echo "b=$b"
  6 echo 'a + b=' `expr $a + $b`
[liyufeng@localhost code]$ ./test8.sh
a=10
b=20
a + b= 30
[liyufeng@localhost code]$ 

二、关系运算符

运算符说明
-eq检测两个数是否相等,相等返回 true。
-ne检测两个数是否不相等,不相等返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。
-lt检测左边的数是否小于右边的,如果是,则返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。
  1 #!/bin/bash
  2 a=10
  3 b=20
  4 echo "a = $a"
  5 echo "b = $b"
  6 
  7 
  8 if [ $a -eq $b ]
  9 then
  10   echo 'a=b'
  11 else
  12   echo 'a !=b'
  13 fi
[liyufeng@localhost code]$ ./test9.sh
a = 10
b = 20
a !=b
[liyufeng@localhost code]$

三、逻辑运算符

运算符说明
非运算,表达式为 true 则返回 false,否则返回 true。
-o或运算,有一个表达式为 true 则返回 true。
-a与运算,两个表达式都为 true 才返回 true。
  1 #!/bin/bash
  2 a=10
  3 b=20
  4 
  5
  6 if [ $a -o $b ]
  7 then
  8 echo 'a或b为true'
  9 fi
[liyufeng@localhost code]$ ./test10.sh
a或b为true
[liyufeng@localhost code]$

四、字符串运算符

运算符说明
=检测两个字符串是否相等,相等返回 true。
!=检测两个字符串是否不相等,不相等返回 tru
-z检测字符串长度是否为0,为0返回 true。
-n检测字符串长度是否不为 0,不为 0 返回 true。
$检测字符串是否为空,不为空返回 true。 检测左边的数是否大于等于右边的,如果是,则返回 true。

五、文件测试运算符

运算符说明
-d file检测文件是否是目录,如果是,则返回 true。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-r file检测文件是否可读,如果是,则返回 true。
-w file检测文件是否可写,如果是,则返回 true。
-x file检测文件是否可执行,如果是,则返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。

Shell计算命令
一、expr命令
expr命令的英文全称是“expression”,即是表达式的意思,作用是一个命令行的计数器,常用于在UNIX/LINUX系统中求表达式变量的值,一般用于整数值,也可用于字符串

[root@localhost studycode]# expr 1 + 1
2
[root@localhost studycode]# expr 2 * 5
expr: syntax error
[root@localhost studycode]# expr 2 \* 5//使用乘号时前面要加反斜杠\
10
[root@localhost studycode]# expr length "this is a test"//计算字符串长度
14
[root@localhost studycode]# expr index "this is a test" "e"//获取某字符位置
12
[root@localhost studycode]# expr substr " this is a test" 3 5//从第3个字符开始截取,取5个字符
his i
[root@localhost studycode]# 

二、(())

#!/bin/bash
((a=1+6))
((b=a-1))
((c=a+b))
echo "a=${a},b=${b},c=${c}"

#多个表达式计算赋值
((a=1+6,b=a-1,c=a+b))

echo "a=${a},b=${b},c=${c}"

#用于逻辑表达式,在if中使用
if((a>7&&b==c))
then
  echo "a>7 && b==c 成立"
else
  echo "a>7 && b==c 不成立"
fi
[root@localhost studycode]# ./test.sh
a=7,b=6,c=13
a=7,b=6,c=13
a>7 && b==c 不成立

三、let命令
let命令和(())命令在数学计算方面功能一样,但是没有(())功能强大,let只能用于赋值计算,不能直接输出,不可以和条件判断一起使用。let用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来

#!/bin/bash
let a=1+6
let b=a-1
let c=a+b
echo "a=${a},b=${b},c=${c}"

#let多个表达式计算赋值
let a=1+6 b=a-1 c=a+b
echo "a=${a},b=${b},c=${c}"
[root@localhost studycode]# ./test.sh
a=7,b=6,c=13
a=7,b=6,c=13

四、$ []命令
和(())、let命令类似,$[]也只能进行整数运算,但是只能对单个表达式的计算求值与输出,并且表达式内部不可以赋值给变量

[root@localhost studycode]# a=$[1+6]
[root@localhost studycode]# echo $a
7
[root@localhost studycode]# b=$[a+1]
[root@localhost studycode]# echo $b
8
[root@localhost studycode]# echo "$[1+6],$[a+1]"
7,8
[root@localhost studycode]# 

五、bc命令
bc的英文全拼为“ Binary Calculator ”,是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。使用quit可退出bc
常用参数
bc -l :使用标准数学库
bc -q : 打印正常的GNU bc环境信息,也就是说不再有进入界面的提示了
互动式计算:

[root@localhost studycode]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1+2
3
quit
[root@localhost studycode]# bc -q
1+2
3

也可以直接计算一个文本文件.比如1.txt中写入以下内容

1122+34
34*5

计算

[root@localhost studycode]# bc -q 1.txt
1156
170

非互动式的管道运算

[root@localhost studycode]# echo "2*3" | bc
6

非互动式的输入重定向计算

[root@localhost studycode]# b=`bc -l<<EOF
1+1
EOF
`
[root@localhost studycode]# echo $b
2

Shell文本处理工具

  • cut:按列提取文件内容
参数说明
c以字符为单位进行分割
-b以字节为单位进行分割
-d自定义分隔符,默认为制表符”TAB”
-f显示指定字段的内容
-n取消分割多字节字符

1.txt内容

AA itheima 11 XX
BB itcast 22 XXX
CC Shell 33 XXXX
DD it 44 XXXXXXX
[root@localhost studycode]# cat 1.txt
AA itheima 11 XX
BB itcast 22 XXX
CC Shell 33 XXXX
DD it 44 XXXXXXX
[root@localhost studycode]# cut 1.txt -d " " -f 1      //按空格进行分割,显示第一列
AA
BB
CC
DD
 [root@localhost studycode]# cut 1.txt -d " " -f 1,3    //按空格进行分割,显示第一列和第三列
AA 11
BB 22
CC 33
DD 44
[root@localhost studycode]# cut 1.txt -d " " -f 2-  //按空格为列进行分割,显示第二列及之后的数据
itheima 11 XX
itcast 22 XXX
Shell 33 XXXX
it 44 XXXXXXX
[root@localhost studycode]# cut 1.txt -d " " -f -2   //显示第二列及之前的数据
AA itheima
BB itcast
CC Shell
DD it
[root@localhost studycode]# cut 1.txt -c 1    //提取第一个字符那列
A
B
C
D
[root@localhost studycode]# cut 1.txt -c -4  //前四个字符的列
AA i
BB i
CC S
DD i
[root@localhost studycode]# 

切割指定单词数据

[root@localhost studycode]# cat 1.txt | grep itheima
AA itheima 11 XX
[root@localhost studycode]# cat 1.txt | grep itheima | cut -d " " -f 2
itheima
[root@localhost studycode]# 

切割提取bash进程的PID号

[root@localhost studycode]# ps -aux | grep bash
root        728  0.0  0.0 115412   896 ?        S    01:50   0:00 /bin/bash /usr/sbin/ksmtuned
root      28003  0.0  0.2 116444  2900 pts/1    Ss   03:58   0:00 -bash
root      68149  0.0  0.0 112816   968 pts/1    S+   07:20   0:00 grep --color=auto bash
[root@localhost studycode]# ps -aux | grep bash | head -n 1
root        728  0.0  0.0 115412   896 ?        S    01:50   0:00 /bin/bash /usr/sbin/ksmtuned
[root@localhost studycode]# ps -aux | grep bash | head -n 1 | cut -d " " -f 9
728
[root@localhost studycode]# 

切割提取ip地址

[root@localhost studycode]# ifconfig | grep broadcast | head -n 1
        inet 192.168.184.139  netmask 255.255.255.0  broadcast 192.168.184.255
[root@localhost studycode]# ifconfig | grep broadcast | head -n 1 | cut -d " " -f 10
192.168.184.139
[root@localhost studycode]# 
  • sed命令
    sed是一种流编辑器,它一次处理一行内容,将这行放入缓存,然后才对这行进行处理,处理完后,将缓存区的内容发送到终端
参数说明
-e以选项中指定的script来处理输入的文本文件
-i直接对内容进行修改
-f<script文件>以选项中指定的script文件来处理输入的文本文件。
-n仅显示script处理后的结果。
命令说明
a新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d删除
i插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s取代,通常这个 s 的动作可以搭配正规表示法

向文件中添加数据
编辑1.txt

ABC
itheima itheima
itcast
123
itheima

1.在第三行后面添加hello

[root@localhost studycode]# sed -i '3ahello' 1.txt
[root@localhost studycode]# cat 1.txt
ABC
itheima itheima
itcast
hello
123
itheima
[root@localhost studycode]# 

2.在第三行前面添加hello

[root@localhost studycode]# sed -i '3ihello' 1.txt
[root@localhost studycode]# cat 1.txt
ABC
itheima itheima
hello
itcast
hello
123
itheima
[root@localhost studycode]#

3.在有itheima那行的前面一行插入hi

[root@localhost studycode]# sed -i '/itheima/ihi' 1.txt
[root@localhost studycode]# cat 1.txt
ABC
hi
itheima itheima
hello
itcast
hello
123
hi
itheima
[root@localhost studycode]# 

4.在最后一行后面添加lixiaopang

[root@localhost studycode]# sed -i '$alixiaopang' 1.txt
[root@localhost studycode]# cat 1.txt
ABC
hi
itheima itheima
hello
itcast
hello
123
hi
itheima
lixiaopang
[root@localhost studycode]# 

删除文件中的数据
1.删除第二行

[root@localhost studycode]# sed -i '2d' 1.txt
[root@localhost studycode]# cat 1.txt
ABC
itheima itheima
hello
itcast
hello
123
hi
itheima
lixiaopang
[root@localhost studycode]# 

2.删除奇数行,也就是从第一行开始删除,每隔两行就删除一行

[root@localhost studycode]# sed -i '1~2d' 1.txt
[root@localhost studycode]# cat 1.txt
itheima itheima
itcast
123
itheima
[root@localhost studycode]# 

3.删除1-2行

[root@localhost studycode]# sed -i '1,2d' 1.txt
[root@localhost studycode]# cat 1.txt
123
itheima
[root@localhost studycode]# 

更改文件中的数据
1.将文件第一行改成hello

[root@localhost studycode]# sed -i '1chello' 1.txt
[root@localhost studycode]# cat 1.txt
hello
itheima
[root@localhost studycode]# 

2.将包含itheima的行改为hi

[root@localhost studycode]# sed -i '/itheima/chi' 1.txt
[root@localhost studycode]# cat 1.txt
hello
hi
[root@localhost studycode]# 

3.将最后一行修改为itheima

[root@localhost studycode]# sed -i '$citheima' 1.txt
[root@localhost studycode]# cat 1.txt
hello
itheima
[root@localhost studycode]# 

4.将每行第一个hello替换为hi

[root@localhost studycode]# sed -i 's/hello/hi/' 1.txt
[root@localhost studycode]# cat 1.txt
hi
itheima
[root@localhost studycode]# 

如果想把所有都替换成hi,则写成

sed -i 's/hello/hi/g' 1.txt

其中,g表示全局替换

查询文件或管道中的数据
1.txt中内容为

```bash
ABC
itheima itheima
itcast
123
itheima
[root@localhost studycode]# sed -n '/itcast/p' 1.txt
itcast

管道查询所有进程中含有sshd的进程信息命令

[root@localhost studycode]# ps -aux | sed -n '/sshd/p'
root       1119  0.0  0.3 112900  3696 ?        Ss   May22   0:00 /usr/sbin/sshd -D
root       2140  0.0  0.5 160988  5620 ?        Ss   May22   0:00 sshd: root@pts/0
root      17321  0.0  0.0 117044   984 pts/0    S+   00:29   0:00 sed -n /sshd/p
[root@localhost studycode]# 

多个sed程序命令执行
将1.txt文件中的第一行删除并将itheima替换为itcast

[root@localhost studycode]# sed -e '1d' -e 's/itheima/itcast/g' 1.txt
itcast itcast
itcast
123
itcast
[root@localhost studycode]# 
  • awk命令
    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理
参数说明
-F指定输入时用到的字段分隔符
-v自定义变量
-f从脚本中读取awk命令
-m对val值设置内在限制
内置变量说明
ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价于命令行 -F选项
NF浏览记录的域的个数
NR已读的记录数,也是行号
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符

准备数据
复制/etc/passwd .到当前目录

[root@localhost studycode]# cp /etc/passwd .
[root@localhost studycode]# ls
1.txt  A.sh  B.sh  passwd  student.sh  test7.sh  test.sh

1.默认每行空格切割数据

[root@localhost studycode]# echo "abc 123 456" | awk '{print $1"&"$2"&"$3}'
abc&123&456
[root@localhost studycode]# 

2.搜索passwd文件有root关键字的所有行

[root@localhost studycode]# awk '/root/{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
apache:x:48:48:Apache:/opt/rh/httpd24/root/usr/share/httpd:/sbin/nologin
[root@localhost studycode]# 

3.搜索passwd文件有root关键字的所有行,然后以:拆分并打印输出第7列

[root@localhost studycode]# awk -F ":" '/root/{print $7}' passwd
/bin/bash
/sbin/nologin
/sbin/nologin
You have new mail in /var/spool/mail/root
[root@localhost studycode]# 

4.统计passwd:文件名,每行的行号,每行的列数,对应的完整行内容

[root@localhost studycode]# awk -F: '{print "文件名:"FILENAME",行号:"NR",列数:"NF",内容:"$0}' passwd
文件名:passwd,行号:1,列数:7,内容:root:x:0:0:root:/root:/bin/bash
文件名:passwd,行号:2,列数:7,内容:bin:x:1:1:bin:/bin:/sbin/nologin
文件名:passwd,行号:3,列数:7,内容:daemon:x:2:2:daemon:/sbin:/sbin/nologin
文件名:passwd,行号:4,列数:7,内容:adm:x:3:4:adm:/var/adm:/sbin/nologin
文件名:passwd,行号:5,列数:7,内容:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
文件名:passwd,行号:6,列数:7,内容:sync:x:5:0:sync:/sbin:/bin/sync
文件名:passwd,行号:7,列数:7,内容:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
文件名:passwd,行号:8,列数:7,内容:halt:x:7:0:halt:/sbin:/sbin/halt
文件名:passwd,行号:9,列数:7,内容:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
文件名:passwd,行号:10,列数:7,内容:operator:x:11:0:operator:/root:/sbin/nologin
文件名:passwd,行号:11,列数:7,内容:games:x:12:100:games:/usr/games:/sbin/nologin
文件名:passwd,行号:12,列数:7,内容:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

也可以写成下面这种方式,可读性更强

[root@localhost studycode]# awk -F: '{printf("文件名:%s,行号:%s,列数:%s,内容:%s\n",FILENAME,NR,NF,$0)}' passwd

5.打印passwd第二行信息

[root@localhost studycode]# awk -F ":" 'NR==2{printf("filename:%s,内容:%s\n",FILENAME,$0)}' passwd
filename:passwd,内容:bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost studycode]# 

6.查找以s开头的资源

[root@localhost studycode]# ls -a | awk '/^s/'
student.sh
[root@localhost studycode]# 

7.打印第一列

[root@localhost studycode]# awk -F: '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp

8.打印最后一列

[root@localhost studycode]# awk -F: '{print $NF}' passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin

9.打印倒数第二列

[root@localhost studycode]# awk -F: '{print $(NF-1)}' passwd
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail
/root
/usr/games
/var/ftp

10.打印10到20行的第一列

[root@localhost studycode]# awk -F: '{if(NR>=10 && NR<=20) {print $1}}' passwd
operator
games
ftp
nobody
systemd-network
dbus
polkitd
libstoragemgmt
colord
rpc
saned

11.多分隔符使用

[root@localhost studycode]# echo "one:two/tree" | awk -F "[:/]" '{print $1"&"$2"&"$3}'
one&two&tree
[root@localhost studycode]# 
  • sort
    sort命令的功能是对文件内容进行排序,并将排序结果标准输出或重定向输出到指定文件
参数说明
-n依照数值的大小排序,即升序
-o <输出文件>将排序后的结果存入制定的文件
-r以相反的顺序来排序,即降序
-t <分隔字符>指定排序时所用的栏位分隔字符
-k指定需要排序的栏位

先新建一个文本文件sort.txt

张三 30
李四 95
播仔 85
播仔 85
播仔 86
AA 85
播妞 100

按空格进行分割对第二列数字进行升序

[root@localhost studycode]# sort -t " " -k2n,2 sort.txt
张三 30
AA 85
播仔 85
播仔 85
播仔 86
李四 95
播妞 100
[root@localhost studycode]# 

第一列和第二列相同的进行去重

[root@localhost studycode]# sort -t " " -k2n,2  -uk1,2 sort.txt
张三 30
AA 85
播仔 85
播仔 86
李四 95
播妞 100
[root@localhost studycode]# 

降序去重并保存

[root@localhost studycode]# sort -t " " -k2nr,2  -uk1,2 -o sort2.txt sort.txt
[root@localhost studycode]# ls
1.txt  A.sh  B.sh  passwd  sort2.txt  sort.txt  student.sh  test7.sh  test.sh
[root@localhost studycode]# cat sort2.txt
播妞 100
李四 95
播仔 86
AA 85
播仔 85
张三 30
[root@localhost studycode]# 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值