大数据开发扩展shell--尚硅谷shell笔记

大数据开发扩展shell

学习目标

1 熟悉shell脚本的原理和使用

2 熟悉shell的编程语法

第一节 Shell概述

在这里插入图片描述

1Linux提供的Shell解析器有:

[atguigu@hadoop101 ~]$ cat /etc/shells 

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

2bash和sh的关系

[atguigu@hadoop101 bin]$ ll | grep bash

-rwxr-xr-x. 1 root root 941880 5月  11 2016 bash

lrwxrwxrwx. 1 root root      4 5月  27 2017 sh -> bash

3Centos默认的解析器是bash

[atguigu@hadoop101 bin]$ echo $SHELL

/bin/bash

第二节 Shell脚本入门

(1)需求:创建一个Shell脚本,输出helloworld

(2)案例实操:

[atguigu@hadoop101 datas]$ touch helloworld.sh

[atguigu@hadoop101 datas]$ vim helloworld.sh

 

在helloworld.sh中输入如下内容

#!/bin/bash

echo "helloworld"

(3)脚本的常用执行方式

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

​ sh+脚本的相对路径

[atguigu@hadoop101 datas]$ sh helloworld.sh 

Helloworld

​ sh+脚本的绝对路径

[atguigu@hadoop101 datas]$ sh /home/atguigu/datas/helloworld.sh 

helloworld

​ bash+脚本的相对路径

[atguigu@hadoop101 datas]$ bash helloworld.sh 

Helloworld

​ bash+脚本的绝对路径

[atguigu@hadoop101 datas]$ bash /home/atguigu/datas/helloworld.sh 

Helloworld

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

(a)首先要赋予helloworld.sh 脚本的+x权限

[atguigu@hadoop101 datas]$ chmod +x helloworld.sh

(b)执行脚本

相对路径

[atguigu@hadoop101 datas]$ ./helloworld.sh 

Helloworld

绝对路径

[atguigu@hadoop101 datas]$ /home/atguigu/datas/helloworld.sh 

Helloworld

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

【了解】第三种:在脚本的路径前加上“.”或者 source

(a)有以下脚本

[atguigu@hadoop101 datas]$ cat test.sh 

#!/bin/bash

A=5

echo $A

(b) 分别使用sh,bash,./ 和 . 的方式来执行,结果如下:

[atguigu@hadoop101 datas]$ bash test.sh 

[atguigu@hadoop101 datas]$ echo $A

 

[atguigu@hadoop101 datas]$ sh test.sh 

[atguigu@hadoop101 datas]$ echo $A

 

[atguigu@hadoop101 datas]$ ./test.sh 

[atguigu@hadoop101 datas]$ echo $A

 

[atguigu@hadoop101 datas]$ . test.sh 

[atguigu@hadoop101 datas]$ echo $A

5

原因:

前三种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。

第四种,也就是使用在脚本路径前加“.”或者 source的方式,可以使脚本内容在当前shell里执行,而无需打开子shell!这也是为什么我们每次要修改完/etc/profile文件以后,需要source一下的原因。

开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。

第三节 变量

3.1 系统预定义变量

1)常用系统变量

H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等

2)案例实操

(1)查看系统变量的值

[atguigu@hadoop101 datas]$ echo $HOME

/home/atguigu

(2)显示当前Shell中所有变量:set

[atguigu@hadoop101 datas]$ set

BASH=/bin/bash

BASH_ALIASES=()

BASH_ARGC=()

BASH_ARGV=()

3**.2** 自定义变量

1)基本语法

(1)定义变量:变量名=变量值,注意=号前后不能有空格

(2)撤销变量:unset 变量名

(3)声明静态变量:readonly变量,注意:不能unset

2)变量定义规则

(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

(2)等号两侧不能有空格

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

(4)变量的值如果有空格,需要使用双引号或单引号括起来。

3)案例实操

(1)定义变量A

[atguigu@hadoop101 datas]$ A=5

[atguigu@hadoop101 datas]$ echo $A

5

(2)给变量A重新赋值

[atguigu@hadoop101 datas]$ A=8

[atguigu@hadoop101 datas]$ echo $A

8

(3)撤销变量A

[atguigu@hadoop101 datas]$ unset A

[atguigu@hadoop101 datas]$ echo $A

(4)声明静态的变量B=2,不能unset

[atguigu@hadoop101 datas]$ readonly B=2

[atguigu@hadoop101 datas]$ echo $B

2

[atguigu@hadoop101 datas]$ B=9

-bash: B: readonly variable

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

[atguigu@hadoop102 ~]$ C=1+2

[atguigu@hadoop102 ~]$ echo $C

1+2

(6)变量的值如果有空格,需要使用双引号或单引号括起来

[atguigu@hadoop102 ~]$ D=I love banzhang

-bash: world: command not found

[atguigu@hadoop102 ~]$ D="I love banzhang"

[atguigu@hadoop102 ~]$ echo $D

I love banzhang

(7)可把变量提升为全局环境变量,可供其他Shell程序使用

export 变量名

[atguigu@hadoop101 datas]$ vim helloworld.sh 

在helloworld.sh文件中增加echo $B

#!/bin/bash

 

echo "helloworld"

echo $B

 

[atguigu@hadoop101 datas]$ ./helloworld.sh 

Helloworld

发现并没有打印输出变量B的值。

[atguigu@hadoop101 datas]$ export B

[atguigu@hadoop101 datas]$ ./helloworld.sh 

helloworld

2

3**.3** 特殊变量

3.3.1 $n

1)基本语法

$n (功能描述:n为数字,$0代表该脚本名称,$1- 9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10})

2)案例实操

[atguigu@hadoop101 datas]$ touch parameter.sh 

[atguigu@hadoop101 datas]$ vim parameter.sh

#!/bin/bash

echo '==========$n=========='

echo $0 

echo $1 

echo $2

 

[atguigu@hadoop101 datas]$ chmod 777 parameter.sh

[atguigu@hadoop101 datas]$ ./parameter.sh cls xz

==========$n==========

./parameter.sh

cls

xz

3.3.2 $#

1)基本语法

$# (功能描述:获取所有输入参数个数,常用于循环)。

2)案例实操

[atguigu@hadoop101 datas]$ vim parameter.sh

#!/bin/bash

echo '==========$n=========='

echo $0 

echo $1 

echo $2

echo '==========$#=========='

echo $#

 

[atguigu@hadoop101 datas]$ chmod 777 parameter.sh

[atguigu@hadoop101 datas]$ ./parameter.sh cls xz

==========$n==========

./parameter.sh

cls

xz

==========$#==========

2

3.3.3 ∗ ∗ ∗ 、 ***、 @**

1)基本语法

∗ (功能描述:这个变量代表命令行中所有的参数, * (功能描述:这个变量代表命令行中所有的参数, (功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)

@ (功能描述:这个变量也代表命令行中所有的参数,不过 @ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)

2)案例实操

[atguigu@hadoop101 datas]$ vim parameter.sh

#!/bin/bash

echo '==========$n=========='

echo $0 

echo $1 

echo $2

echo '==========$#=========='

echo $#

echo '==========$*=========='

echo $*

echo '==========$@=========='

echo $@

[atguigu@hadoop101 datas]$ ./parameter.sh a b c d e f g

==========$n==========

./parameter.sh

a

b

==========$#==========

7

==========$*==========

a b c d e f g

==========$@==========

a b c d e f g

3.3.4 $

1)基本语法

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

2)案例实操

判断helloworld.sh脚本是否正确执行

[atguigu@hadoop101 datas]$ ./helloworld.sh 

hello world

[atguigu@hadoop101 datas]$ echo $?

0

四节 运算符

1)基本语法

( ( 运算式 ) ) ”或“ ((运算式))”或“ ((运算式))[运算式]”

2)案例实操:

计算(2+3)* 4的值

[atguigu@hadoop101 datas]# S=$[(2+3)*4]

[atguigu@hadoop101 datas]# echo $S

第五节 条件判断

1)基本语法

(1)test condition

(2)[ condition ](注意condition前后要有空格)

注意:条件非空即为true,[ atguigu ]返回true,[ ] 返回false。

2)常用判断条件

(1)两个整数之间比较

-eq 等于(equal) -ne 不等于(not equal)

-lt 小于(less than) -le 小于等于(less equal)

-gt 大于(greater than) -ge 大于等于(greater equal)

(2)按照文件权限进行判断

-r 有读的权限(read)

-w 有写的权限(write)

-x 有执行的权限(execute)

(3)按照文件类型进行判断

-e 文件存在(existence)

-f 文件存在并且是一个常规的文件(file)

-d 文件存在并且是一个目录(directory)

3)案例实操

(1)23是否大于等于22

[atguigu@hadoop101 datas]$ [ 23 -ge 22 ]

[atguigu@hadoop101 datas]$ echo $?

0

(2)helloworld.sh是否具有写权限

[atguigu@hadoop101 datas]$ [ -w helloworld.sh ]

[atguigu@hadoop101 datas]$ echo $?

0

(3)/home/atguigu/cls.txt目录中的文件是否存在

[atguigu@hadoop101 datas]$ [ -e /home/atguigu/cls.txt ]

[atguigu@hadoop101 datas]$ echo $?

1

(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)

[atguigu@hadoop101 ~]$ [ atguigu ] && echo OK || echo notOK

OK

[atguigu@hadoop101 datas]$ [ ] && echo OK || echo notOK

notOK

六节 流程控制(重点)

6.1 if判断

1)基本语法

(1)单分支

if [ 条件判断式 ];then

​ 程序

fi

或者

if [ 条件判断式 ]

then

​ 程序

fi

(2)多分支

if [ 条件判断式 ]

then

​ 程序

elif [ 条件判断式 ]

then

​ 程序

else

​ 程序

fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

2)案例实操

输入一个数字,如果是1,则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。

[atguigu@hadoop101 datas]$ touch if.sh

[atguigu@hadoop101 datas]$ vim if.sh

 

#!/bin/bash

 

if [ $1 -eq 1 ]

then

       echo "banzhang zhen shuai"

elif [ $1 -eq 2 ]

then

       echo "cls zhen mei"

fi

 

[atguigu@hadoop101 datas]$ chmod 777 if.sh 

[atguigu@hadoop101 datas]$ ./if.sh 1

banzhang zhen shuai

6.2 case语句

1)基本语法

case $变量名 in

“值1”)

​ 如果变量的值等于值1,则执行程序1

;;

“值2”)

​ 如果变量的值等于值2,则执行程序2

;;

​ …省略其他分支…

*)

​ 如果变量的值都不是以上的值,则执行此程序

;;

esac

注意事项:

(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

(2)双分号“;;”表示命令序列结束,相当于java中的break。

(3)最后的“*)”表示默认模式,相当于java中的default。

2)案例实操

输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它,输出renyao。

[atguigu@hadoop101 datas]$ touch case.sh

[atguigu@hadoop101 datas]$ vim case.sh

 

!/bin/bash

 

case $1 in

"1")

        echo "banzhang"

;;

 

"2")

        echo "cls"

;;

*)

        echo "renyao"

;;

esac

 

[atguigu@hadoop101 datas]$ chmod 777 case.sh

[atguigu@hadoop101 datas]$ ./case.sh 1

1

6.3 for循环

1)基本语法1

for (( 初始值;循环控制条件;变量变化 ))

do

​ 程序

done

2)案例实操

从1加到100

[atguigu@hadoop101 datas]$ touch for1.sh

[atguigu@hadoop101 datas]$ vim for1.sh

 

#!/bin/bash

 

sum=0

for((i=0;i<=100;i++))

do

        sum=$[$sum+$i]

done

echo $sum

 

[atguigu@hadoop101 datas]$ chmod 777 for1.sh 

[atguigu@hadoop101 datas]$ ./for1.sh 

5050

3)基本语法2

for 变量 in 值1 值2 值3…

do

​ 程序

done

4)案例实操

(1)打印所有输入参数

[atguigu@hadoop101 datas]$ touch for2.sh

[atguigu@hadoop101 datas]$ vim for2.sh

 

#!/bin/bash

#打印数字

 

for i in cls mly wls

do

     echo "ban zhang love $i"

done

 

[atguigu@hadoop101 datas]$ chmod 777 for2.sh 

[atguigu@hadoop101 datas]$ ./for2.sh

ban zhang love cls

ban zhang love mly

ban zhang love wls

(2)比较 ∗ 和 *和 @区别

∗ 和 *和 @都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2 … 2 … 2n的形式输出所有参数。

[atguigu@hadoop101 datas]$ touch for3.sh

[atguigu@hadoop101 datas]$ vim for3.sh

 

#!/bin/bash 

echo '=============$*============='

for i in $*

do

      echo "ban zhang love $i"

done

 

echo '=============$@============='

for j in $@

do      

      echo "ban zhang love $j"

done

 

[atguigu@hadoop101 datas]$ chmod 777 for3.sh

[atguigu@hadoop101 datas]$ ./for3.sh cls mly wls

=============$*=============

banzhang love cls

banzhang love mly

banzhang love wls

=============$@=============

banzhang love cls

banzhang love mly

banzhang love wls

当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 2 … 2 … 2n”的形式输出所有参数;$@会将各个参数分开,以“$1” “ 2 ” … “ 2”…“ 2”n”的形式输出所有参数。

[atguigu@hadoop101 datas]$ vim for4.sh

 

#!/bin/bash 

echo '=============$*============='

for i in "$*" 

#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 

do 

       echo "ban zhang love $i"

done 

 

echo '=============$@============='

for j in "$@" 

#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 

do 

       echo "ban zhang love $j" 

done

 

[atguigu@hadoop101 datas]$ chmod 777 for4.sh

[atguigu@hadoop101 datas]$ ./for4.sh cls mly wls

=============$*=============

banzhang love cls mly wls

=============$@=============

banzhang love cls

banzhang love mly

banzhang love wls

6.4 while循环

1)基本语法

while [ 条件判断式 ]

do

​ 程序

done

2**)案例实操**

从1加到100

[atguigu@hadoop101 datas]$ touch while.sh

[atguigu@hadoop101 datas]$ vim while.sh

 

#!/bin/bash

sum=0

i=1

while [ $i -le 100 ]

do

      sum=$[$sum+$i]

      i=$[$i+1]

done

 

echo $sum

 

[atguigu@hadoop101 datas]$ chmod 777 while.sh 

[atguigu@hadoop101 datas]$ ./while.sh 

5050

七节 read读取控制台输入

1)基本语法

read (选项) (参数)

选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

参数

​ 变量:指定读取值的变量名

2)案例实操

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

[atguigu@hadoop101 datas]$ touch read.sh

[atguigu@hadoop101 datas]$ vim read.sh

 

#!/bin/bash

 

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

echo $NAME

 

[atguigu@hadoop101 datas]$ ./read.sh 

Enter your name in 7 seconds : atguigu

atguigu

八节 函数

8.1 系统函数

8.1.1 basename

1)基本语法

basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项:

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

2)案例实操

截取该/home/atguigu/banzhang.txt路径的文件名称

[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt 

banzhang.txt

[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt .txt

banzhang

8.1.2 dirname

1)基本语法

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

2)案例实操

获取banzhang.txt文件的路径

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

/home/atguigu

8.2 自定义函数

1)基本语法

[ function ] funname[()]

{

​ Action;

​ [return int;]

}

2)经验技巧

(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

3)案例实操

计算两个输入参数的和

[atguigu@hadoop101 datas]$ touch fun.sh

[atguigu@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;

 

[atguigu@hadoop101 datas]$ chmod 777 fun.sh

[atguigu@hadoop101 datas]$ ./fun.sh 

Please input the number1: 2

Please input the number2: 5

7

九节 Shell工具(重点)

9.1 cut

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

1)基本用法

cut [选项参数] filename

说明:默认分隔符是制表符

2)选项参数说明

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列,默认是制表符“\t”
-c指定具体的字符

3)案例实操

(1)数据准备

[atguigu@hadoop101 datas]$ touch cut.txt

[atguigu@hadoop101 datas]$ vim cut.txt

dong shen

guan zhen

wo  wo

lai  lai

le  le

(2)切割cut.txt第一列

[atguigu@hadoop101 datas]$ cut -d " " -f 1 cut.txt 

dong

guan

wo

lai

le

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

[atguigu@hadoop101 datas]$ cut -d " " -f 2,3 cut.txt 

shen

zhen

 wo

 lai

 le

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

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

guan

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

[atguigu@hadoop101 datas]$ echo $PATH

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin

[atguigu@hadoop101 datas]$ echo $PATH | cut -d ":" -f 3-

/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin

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

[atguigu@hadoop101 datas]$ ifconfig ens33 | grep netmask | cut -d "i" -f 2 | cut -d " " -f 2

192.168.6.101

9.2 awk

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

1)基本用法

awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}…’ filename

pattern:表示awk在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

2)选项参数说明

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

3)案例实操

(1)数据准备

[atguigu@hadoop101 datas]$ sudo cp /etc/passwd ./

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

[atguigu@hadoop101 datas]$ awk -F : '/^root/{print $7}' passwd 

/bin/bash

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

[atguigu@hadoop101 datas]$ awk -F : '/^root/{print $1","$7}' passwd 

root,/bin/bash

注意:只有匹配了pattern的行才会执行action

(4)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"dahaige,/bin/zuishuai"。

[atguigu@hadoop101 datas]$ awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd

user, shell

root,/bin/bash

bin,/sbin/nologin

。。。

atguigu,/bin/bash

dahaige,/bin/zuishuai

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。

(5)将passwd文件中的用户id增加数值1并输出

[atguigu@hadoop101 datas]$ awk -v i=1 -F : '{print $3+i}' passwd

1

2

3

4

4**)awk的内置变量**

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

5)案例实操

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

[atguigu@hadoop101 datas]$ awk -F : '{print "filename:" FILENAME  ",linenum:" NR ",col:"NF}' passwd 

filename:passwd,linenum:1,col:7

filename:passwd,linenum:2,col:7

filename:passwd,linenum:3,col:7

。。。

(2)查询ifconfig命令输出结果中的空行所在的行号

[atguigu@hadoop101 datas]$ ifconfig | awk '/^$/{print NR}'

9

18

26

(3)切割IP

[atguigu@hadoop101 datas]$ ifconfig ens33 | grep netmask | awk -F "inet" '{print $2}' | awk -F " " '{print $1}' 

192.168.6.101

9.3 sort

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

1)基本语法

Sort (选项) (参数)

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

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

2)案例实操

(1)数据准备

[atguigu@hadoop101 datas]$ touch sort.txt

[atguigu@hadoop101 datas]$ vim sort.txt

bb:40:5.4

bd:20:4.2

xz:50:2.3

cls:10:3.5

ss:30:1.6

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

[atguigu@hadoop101 datas]$ 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

9**.4 wc**

wc命令用来统计文件信息。利用wc指令我们可以计算文件的行数,字节数、字符数等。

1)基本语法

wc [选项参数] filename

选项参数功能
-l统计文件行数
-w统计文件的单词数
-m统计文件的字符数
-c统计文件的字节数

2)案例实操

统计/etc/profile文件的行数、单词数、字节数!

[atguigu@hadoop101 datas]$ wc -l /etc/profile 

[atguigu@hadoop101 datas]$ wc -w /etc/profile 

[atguigu@hadoop101 datas]$ wc -m /etc/profile

第十节 正则表达式入门

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

10.1 常规匹配

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

[atguigu@hadoop101 datas]$ cat /etc/passwd | grep atguigu

就会匹配所有包含atguigu的行

10.2 常用特殊字符

1)特殊字符:^

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

[atguigu@hadoop101 datas]$ cat /etc/passwd | grep ^a

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

2)特殊字符:$

$ 匹配一行的结束,例如

[atguigu@hadoop101 datas]$ cat /etc/passwd | grep t$

会匹配出所有以t结尾的行

思考:^$ 匹配什么?

3)特殊字符:.

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

[atguigu@hadoop101 datas]$ cat /etc/passwd | grep r..t

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

4)特殊字符:*

  • 不单独使用,他和上一个字符连用,表示匹配上一个字符0次或多次,例如
[atguigu@hadoop101 datas]$ cat /etc/passwd | grep ro*t

会匹配rt, rot, root, rooot, roooot等所有行

思考:.* 匹配什么?

5)特殊字符:[ ]

[ ] 表示匹配某个范围内的一个字符,例如

[6,8]------匹配6或者8

[0-9]------匹配一个0-9的数字

[0-9]*------匹配任意长度的数字字符串

[a-z]------匹配一个a-z之间的字符

[a-z]* ------匹配任意长度的字母字符串

[a-c, e-f]-匹配a-c或者e-f之间的任意字符

[atguigu@hadoop101 datas]$ cat /etc/passwd | grep r[a,b,c]*t

会匹配rt,rat, rbt, rabt, rbact,rabccbaaacbt等等所有行

6)特殊字符:\

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

[atguigu@hadoop101 datas]$ cat /etc/passwd | grep a\$b

就会匹配所有包含 a$b 的行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/480996.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

男性三十三岁,头晕头疼,心慌和后背发紧,竟被它治好了!

植物神经紊乱是一种影响现代人健康的常见问题&#xff0c;它源于植物神经系统功能失调&#xff0c;导致身心健康出现一系列不适症状。植物神经紊乱对身体健康的影响是多方面的&#xff0c;它可能导致睡眠问题、情绪波动和自律神经功能紊乱等多种不适症状&#xff0c;严重影响个…

深度学习,CRNN+CTC和Attention OCR你更青睐哪一种?

深度学习在OCR领域的应用已经取得了瞩目的成果&#xff0c;而选择合适的算法对于提升OCR的识别准确率至关重要。在众多算法中&#xff0c;CRNN和Attention OCR犹如两颗璀璨的明珠&#xff0c;备受瞩目。 CRNN&#xff0c;这位结合了卷积神经网络&#xff08;CNN&#xff09;和…

如何在 iPad 上恢复已删除的历史记录?

iPad 配备了一个名为 Safari 的内置网络浏览器。这是一种在旅途中保持联系和浏览网页的强大且便捷的方式。但如果您不小心删除了浏览历史记录&#xff0c;则尝试恢复它可能会很令人沮丧。 幸运的是&#xff0c;您可以通过多种方法在 iPad 上恢复已删除的 Safari 历史记录。您应…

【自然语言处理七-经典论文-attention is all you need】

然语言处理七-经典论文-attention is all you need 摘要原文译文小结 1&#xff1a;引言原文译文小结 2&#xff1a;背景原文译文小结 3&#xff1a;模型架构原文译文小结 3.1 编码器和解码器原文译文小结 3.2 注意力原文译文小结3.2.1 缩放点积注意力原文总结 3.2.2 多头注意力…

计算机网络——数据链路层(数据链路层功能概述)

计算机网络——数据链路层&#xff08;数据链路层功能概述&#xff09; 数据链路层的功能数据链路层的基本概念封装成帧和透明传输 我们之前已经学完了物理层的所有内容&#xff0c;今天开始我们要进入数据链路层的学习&#xff0c;如果有小伙伴对物理层的内容感兴趣的话&#…

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链

目录 前言 分析 EXP SignedObject打二次反序列化 打TemplatesImpl加载恶意字节码 前文&#xff1a;【Web】浅聊Jackson序列化getter的利用——POJONode 前言 题目环境:2023巅峰极客 BabyURL 之前AliyunCTF Bypassit I这题考查了这样一条链子&#xff1a; BadAttributeV…

C语言 自定义类型:结构体

目录 前言 一、结构体类型 1.1 结构体的声明 1.2 结构体变量的创建和初始化 1.3 结构体的特殊声明 1.4 结构体的自引用 二、结构体的对齐 2.1 对齐规则 2.2 内存对齐的原因 2.3 修改默认对齐数 2.4 结构体传参 三、结构体实现位段 3.1 位段的内存分配 3.2 段的跨平…

39 openlayers 对接地图图层 绘制点线面圆

前言 这里主要是展示一下 openlayers 的一个基础的使用 主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 增加 省市区县 的边界标记 基础绘制 点线面园 等等 测试用例 <template><div style"width: 1920px; height:1080px;" &g…

软考高级:软件架构评估概述和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

计算机网络:分层体系结构

计算机网络&#xff1a;分层体系结构 基本分层概述各层次的任务物理层数据链路层网络层运输层应用层 数据传递过程分层体系常见概念实体协议服务 基本分层概述 为了使不同体系结构的计算机网络都能互联&#xff0c;国际标准化组织于 1977 年成立了专门机构研究该问题。不久他们…

鸿蒙一次开发,多端部署(十一)交互归一

对于不同类型的智能设备&#xff0c;用户可能有不同的交互方式&#xff0c;如通过触摸屏、鼠标、触控板等。如果针对不同的交互方式单独做适配&#xff0c;会增加开发工作量同时产生大量重复代码。为解决这一问题&#xff0c;我们统一了各种交互方式的API&#xff0c;即实现了交…

基于ssm的勤工助学管理系统+数据库+报告+免费远程调试

项目介绍: 基于ssm的勤工助学管理系统。Javaee项目&#xff0c;ssm项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatisplus VuelayuiMaven来实现。有管理员和老…

国内AI领域的新星:Kimi与GPT的较量,谁主沉浮?

近期&#xff0c;国产大型人工智能模型Kimi频繁成为众多行业领袖讨论的焦点。这些来自不同领域的专家和领袖们&#xff0c;似乎都在对Kimi的性能和能力给予高度评价。在这两年国产AI模型的快速发展中&#xff0c;尽管市场上涌现出了许多新面孔&#xff0c;但真正能够在技术和应…

Tomcat整体架构

一、Tomcat介绍 开源的java web应用服务器&#xff0c;实现了java EE的部分技术规范&#xff0c;如 java servlet、javaServer Pages、 JavaWebSocket等&#xff1b; 核心&#xff1a;http服务器Servlet容器 二、Tomcat两个核心功能 1、处理Socket连接&#xff0c;负责网络字节…

jQuery 其他方法

文章目录 1. jQuery 拷贝对象2. 多库共存3. jQuery 插件3.1 瀑布流插件3.2 图片懒加载技术3.3 bootstrap JS 组件3.4 bootstrap JS 插件*案例--todolist布局 1. jQuery 拷贝对象 拷贝过去的对象属性值会覆盖原来对象的值。 **浅拷贝&#xff1a;**简单数据类型就直接被拷贝&am…

第十三届蓝桥杯物联网试题(省赛)

做后感悟&#xff1a; OLED显示函数需要一直显示&#xff0c;所以在主函数中要一直循环&#xff0c;为了确保这个检错功能error只输出一次&#xff0c;最好用中断串口进行接收数据&#xff0c;数据收完后自动进入中断函数中&#xff0c;做一次数据检查就好了&#xff0c;该开灯…

正基塑业邀您参观2024长三角快递物流供应链与技术装备展览会

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 展会介绍 2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09;&#xff0c;于2024年7月8-10日在杭州…

QGraphicsView 实例3地图浏览器

主要介绍Graphics View框架&#xff0c;实现地图的浏览、放大、缩小&#xff0c;以及显示各个位置的视图、场景和地图坐标 效果图: mapwidget.h #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QLabel> #include <QMouseEvent> #include <QGraphicsView&…

Tomcat 服务器部署和 IDEA 配置 Tomcat

(一) Tomcat 简介 Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP少量JavaEE规范。 概念中提到了JavaEE规范&#xff0c;那什么又是JavaEE规范呢? JavaEE: Java Enterprise Edition,Java企业版。指Java企业级…

【Java初阶(二)】分支与循环

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1.前言2.顺序结构3.分支循环3.1if语句3.2switch语句 4.循环结构4.1while循环4.2 break和continue4.3 for循环4.4 do while循环 5.输入输出5.1输出5.2输…