使用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 4月 27 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 | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
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]#