shell 中的工具,read及函数

一. read读取控制台输入

1. 基本语法

read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名

2. 案例实操

提示7秒内,读取控制台输入的名称

[atbigdata@hadoop101 datas]$ touch read.sh
[atbigdata@hadoop101 datas]$ vim read.sh

#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME

[atbigdata@hadoop101 datas]$ ./read.sh 
Enter your name in 7 seconds xiaoze
xiaoze

二. 函数

2.1 系统函数

2.1.1 basename

1. 基本语法

basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

2. 案例实操
截取该/home/atbigdata/banzhang.txt路径的文件名称
[atbigdata@hadoop101 datas]$ basename /home/atbigdata/banzhang.txt 
banzhang.txt
[atbigdata@hadoop101 datas]$ basename /home/atbigdata/banzhang.txt .txt
banzhang

2.1.2 dirname

1. 基本语法
dirname 文件绝对路径		(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
2. 案例实操

获取banzhang.txt文件的路径

[atbigdata@hadoop101 ~]$ dirname /home/atbigdata/banzhang.txt 
/home/atbigdata

2.2 自定义函数

2.2.1. 基本语法
    #定义函数
[ function ] funname[()]
{
	Action;
	[return int;]
}
#调用函数
funname
2.2.2.经验技巧

(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

2.2.3. 案例实操

计算两个输入参数的和

[atbigdata@hadoop101 datas]$ touch fun.sh
[atbigdata@hadoop101 datas]$ vim fun.sh

#!/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;

[atbigdata@hadoop101 datas]$ chmod 777 fun.sh
[atbigdata@hadoop101 datas]$ ./fun.sh 
Please input the number1: 2
Please input the number2: 5
7

三. Shell工具

3.1 cut

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

3.1.1.基本用法

cut [选项参数] filename
说明:默认分隔符是制表符

3.3.2. 选项参数说明

选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
-c 指定具体的字符

3.3.3. 案例实操

(1)数据准备

[atbigdata@hadoop101 datas]$ touch cut.txt
[atbigdata@hadoop101 datas]$ vim cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le

(2)切割cut.txt第一列

[atbigdata@hadoop101 datas]$ cut -d " " -f 1 cut.txt 
dong
guan
wo
lai
le

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

[atbigdata@hadoop101 datas]$ cut -d " " -f 2,3 cut.txt 
shen
zhen
wo
lai
le

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

[atbigdata@hadoop101 datas]$ cat cut.txt | grep "guan" | cut -d " " -f 1
guan

(5)选取系统PATH变量值,第2个“:”开始后的所有路径:

[atbigdata@hadoop101 datas]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atbigdata/bin

[atbigdata@hadoop102 datas]$ echo $PATH | cut -d: -f 2-
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atbigdata/bin

(6)切割ifconfig 后打印的IP地址

[atbigdata@hadoop101 datas]$ ifconfig eth0 | grep "inet addr" | cut -d: -f 2 | cut -d" " -f1
192.168.1.102

3.2 awk

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

3.2.1. 基本用法

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

3.2.2. 选项参数说明

选项参数 功能
-F 指定输入文件折分隔符
-v 赋值一个用户定义变量

3.2.3. 案例实操

(1)数据准备

[atbigdata@hadoop102 datas]$ sudo cp /etc/passwd ./

(2)搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。

[atbigdata@hadoop102 datas]$ awk -F: '/^root/{print $7}' passwd 
/bin/bash

(3)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。

[atbigdata@hadoop102 datas]$ awk -F: '/^root/{print $1","$7}' passwd 
root,/bin/bash

注意:只有匹配了pattern的行才会执行action
(4)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"dahaige,/bin/zuishuai"。

[atbigdata@hadoop102 datas]$ awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd
user, shell
root,/bin/bash
bin,/sbin/nologin
。。。
atbigdata,/bin/bash
dahaige,/bin/zuishuai

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
(5)将passwd文件中的用户id增加数值1并输出

[atbigdata@hadoop102 datas]$ awk -v i=1 -F: '{print $3+i}' passwd
1
2
3
4
3.2.4 awk的内置变量

变量 说明
FILENAME 文件名
NR 已读的记录数(行数)
NF 浏览记录的域的个数(切割后,列的个数)

3.2.5 案例实操

(1)统计passwd文件名,每行的行号,每行的列数

[atbigdata@hadoop102 datas]$ awk -F: '{print "filename:"  FILENAME ", linenumber:" NR  ",columns:" NF}' passwd 
filename:passwd, linenumber:1,columns:7
filename:passwd, linenumber:2,columns:7
filename:passwd, linenumber:3,columns:7

(2)切割IP

[atbigdata@hadoop102 datas]$ ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}' 
192.168.1.102

(3)查询cut.txt中空行所在的行号

[atbigdata@hadoop102 datas]$ awk '/^$/{print NR}' cut.txt 
5

3.3 sort

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

3.3.1 基本语法

sort(选项)(参数)
选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列
参数:指定待排序的文件列表

3.3.2 案例实操

(1)数据准备

[atbigdata@hadoop102 datas]$ touch sort.sh
[atbigdata@hadoop102 datas]$ vim sort.sh 
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6

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

[atbigdata@hadoop102 datas]$ sort -t : -nrk 3  sort.sh 
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6

四. 正则表达式

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等命令都支持通过正则表达式进行模式匹配。

4.1 常规匹配

一串不包含特殊字符的正则表达式匹配它自己,例如:

[atbigdata@hadoop102 datas]$ cat /etc/passwd | grep atbigdata

就会匹配所有包含atbigdata的行

4.2 常用特殊字符

4.2.1. 特殊字符:^

^ 匹配一行的开头,例如:

[atbigdata@hadoop102 datas]$ cat /etc/passwd | grep ^a

会匹配出所有以a开头的行

4.2.2 特殊字符:$

$ 匹配一行的结束,例如

[atbigdata@hadoop102 datas]$ cat /etc/passwd | grep t$

会匹配出所有以t结尾的行
思考:^$ 匹配什么?

4.2.3 特殊字符:.

. 匹配一个任意的字符,例如

[atbigdata@hadoop102 datas]$ cat /etc/passwd | grep r..t

会匹配包含rabt,rbbt,rxdt,root等的所有行

4.2.4 特殊字符:*
  • 不单独使用,他和左边第一个字符连用,表示匹配上一个字符0次或多次,例如
    [atbigdata@hadoop102 datas]$ cat /etc/passwd | grep ro*t
    会匹配rt, rot, root, rooot, roooot等所有行
4.2.5 特殊字符:[ ]

[ ] 表示匹配某个范围内的一个字符,例如
[6,8]------匹配6或者8
[a-z]------匹配一个a-z之间的字符
[a-z]*-----匹配任意字母字符串
[a-c, e-f]-匹配a-c或者e-f之间的任意字符
[atbigdata@hadoop102 datas]$ cat /etc/passwd | grep r[a,b,c]*t
会匹配rat, rbt, rabt, rbact等等所有行

4.2.6 特殊字符:\

\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 ‘$’ 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如

[atbigdata@hadoop102 datas]$ cat /etc/passwd | grep a\$b

注意:直接匹配 $ 字符,需要进行转义并且加上单引号
就会匹配所有包含 a$b 的行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值