大数据讲课笔记1.8 shell基础
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据讲课笔记1.8 shell基础相关的知识,希望对你有一定的参考价值。
文章目录
- 零、学习目标
- 一、导入新课
- 二、新课讲解
- 三、归纳总结
- 四、上机操作
- 五、拓展学习
零、学习目标
- 能熟练使用shell命令
- 会编写简单shell脚本
一、导入新课
- Linux中的shell是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息。
二、新课讲解
(一)shell概述
1、了解shell的含义
- 首先shell的英文含义是“壳”;它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息。
2、Linux中shell存在形式
- 由于Linux不同于Windows,Linux是内核与界面分离的,它可以脱离图形界面而单独运行,同样也可以在内核的基础上运行图形化的桌面。这样,在Linux系统中,就出现了两种shell表现形式,一种是在无图形界面下的终端运行环境下的shell,另一种是桌面上运行的类似Windows 的MS-DOS运行窗口,前者我们一般习惯性地简称为
终端(terminal)
,后者一般直接称为shell
。
3、shell如何执行用户指令
- shell有两种执行指令的方式,第一种方法是用户事先编写一个sh脚本文件,内含shell脚本,而后使用shell程序执行该脚本,这种方式,我们习惯称为shell编程。
- 第二种形式,则是用户直接在shell界面上执行shell命令,由于shell界面的关系,大家都习惯一行行的书写,很少写出成套的程序来一起执行,所以也称命令行。
- 总结:shell可以说只是为用户与机器之间搭建成的一个桥梁,让我们能够通过shell来对计算机进行操作和交互,从而达到让计算机为我们服务的目的。
(二)常用shell命令
1、管道命令
(1)命令概述
- 管道命令只能处理经由前面一个指令传出的正确输出信息,对错误信息信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入。
- 【指令1】正确输出,作为【指令2】的输入,然后【指令2】的输出作为【指令3】的输入 ,【指令3】输出就会直接显示在屏幕上面了。通过管道之后【指令1】和【指令2】的正确输出不显示在屏幕上面。
(2)命令格式
- 命令1 | 命令2,命令1的输入作为命令2的输入
(3)案例演示
任务1、查看/etc
目录信息前5行信息
- 执行命令:
ll /etc | head -5
任务2、查看/etc/profile
文件后5行信息
- 执行命令:
cat /etc/profile | tail -5
2、grep命令
(1)命令概述
- grep (缩写来自Globally search a Regular Expression and Print - 全局搜索正则表达式并打印)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。
- Windows系统下类似命令
findstr
,比如查看哪个进程占用了443
端口
(2)命令格式
- grep [选项参数] 文件
(3)选项参数
参数 | 作用 |
---|---|
-c | 只输出匹配行的计数 |
-l | 不区分大 小写(只适用于单字符) |
-h | 查询多文件时不显示文件名 |
-n | 显示匹配行及行号 |
-s | 不显示不存在或无匹配文本的错误信息 |
-v | 显示不包含匹配文本的所有行 |
\\ | 忽略正则表达式中特殊字符的原有含义 |
[ ] | 单个字符,如[A]即A符合要求 |
[-] | 范围,如[A-Z],即A、B、C一直到Z都符合要求 |
. | 所有的单个字符 |
* | 任意字符,长度可以为0 |
(4)案例演示
任务1、抓取/etc
目录下的python信息
- 执行命令:
ll /etc | grep python
- 执行命令:
ll /etc | grep -c python
任务2、抓取/etc/profile
文件里的dev信息
- 执行命令:
cat /etc/profile | grep dev
任务3、抓取用户数据文件中以how
打头的信息
- 执行命令:
cat /etc/passwd | grep how*
任务4、显示所有以d开头的文件中包含hi的行
- 执行命令:
grep hi d*
任务5、显示两个文件匹配某个字符串的行
- 执行命令:
grep 'hadoop' demo.txt demo1.txt
任务6、显示文件中至少有n个连续小写字符的行
- 执行命令:
grep '[a-z]\\7\\' demo.txt
- 执行命令:
grep '[a-z]\\6\\' demo.txt
3、find命令
(1)命令概述
- find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
(2)命令格式
- find 路径 [选项参数]
(3)选项参数
参数 | 作用 |
---|---|
-type | 按类型查找(d - 目录;l - 链接;f - 文件) |
-name | 按名称查找(可使用通配符) |
-size | 按大小查找 |
-perm | 按权限查找 |
(4)案例演示
任务1、按类型查找
- 执行命令:
find /etc/sysconfig -type 'd'
- 检查是否查找成功
- 执行命令:
find /etc/sysconfig -type 'l'
- 执行命令:
find /etc/sysconfig -type 'f'
任务2、按名称查找
-
执行命令:find /etc/sysconfig -name ‘network’
-
执行命令:
find /etc/sysconfig -name 'net*'
(可使用通配符)
-
大家可曾记得我们在配置静态IP地址时使用过
/etc/sysconfig/network-scripts
目录里的ifcfg-ens33
文件?
任务3、按大小查找
-
执行命令:
find /etc/sysconfig -size 15c
(等于15字节)
-
执行命令:
find /etc/sysconfig -size +10k
(大于10240个字节)
-
执行命令:
find /etc/sysconfig -size -20c
(小于20个字节)
任务4、按权限查找
- 执行命令:
find /etc/sysconfig -perm '777'
(权限字符串:rwxrwxrwx)
- 执行命令:
find /etc/sysconfig -perm '755'
(权限字符串:rwxr-xr-x)
4、sed命令
(1)命令概述
- sed (stream editor)是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
(2)命令格式
- sed “[action]” [filename]
(3)参数说明
参数 | 作用 |
---|---|
a | 新增, a 的后面可以接字串,这些字串会在新的一行出现(当前行的下一行) |
c | 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行 |
d | 删除,因为是删除啊,所以 d 后面通常不接任何东西 |
i | 插入, i 的后面可以接字串,这些字串会在新的一行出现(当前行的上一行) |
p | 打印,将某个选择的数据打印出,通常 p 会与参数 sed -n 一起运行 |
s | 取代,可以直接进行取代工作,通常这个 s 的动作可以搭配正规表示法 |
(4)案例演示
- 预备工作:创建demo.txt
1)替换操作(s - substitute)
任务1、将所有行的第一个hello替换成HELLO
- 执行命令:
sed "s/hello/HELLO/" demo.txt
- 注意:输出内容是替换了的,但是原文件依然如故。
任务2、将第2行到第3行的第2个hello替换成HELLO
- 执行命令:
sed "2,3s/hello/HELLO/2" demo.txt
- 思考题:假设一个文件有5行,要替换的是第2行到第4行,应该怎么设置替换的行数范围?
- 同学们的验证结果:
sed "2,4s/hello/HELLO/2"
任务3、将第2行的hello全部替换成HELLO
- 执行命令:
sed "2s/hello/HELLO/g" demo.txt
任务4、将全部的hello替换成HELLO后生成新文件
- 执行命令:
sed "s/hello/HELLO/g" demo.txt > demo1.txt
任务5、将全部的hello替换成hi,要求修改原文件
- 执行命令:
sed -i "s/hello/hi/g" demo.txt
2)插入操作(i - insert, a - append)
任务1、在第2行之前插入一行新内容
- 执行命令:
sed "2 i I love Linux" demo.txt
任务2、在第2行之后插入一行新内容
- 执行命令:
sed "2 a Linux is fun and I love it" demo.txt
3)删除操作(d - delete)
任务1、删除第2行
- 执行命令:
sed '2d' demo.txt
任务2、删除第2行到第3行
- 执行命令:
sed '2,3d' demo.txt
任务3、删除文件所有行
- 执行命令:
sed 'd' demo.txt
任务4、删除包含指定字符串的行
- 执行命令:
sed '/scala/g' demo.txt
- 思考题:删除匹配行时,只是删除内容,行还依然存在,如何能将行也删除掉?
- 将动作参数最后的
/g
改为/d
即可,执行命令:sed '/scala/d' demo.txt
5、tail命令
(1)命令概述
- 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
(2)命令格式
- tail [选项参数] 文件名
(3)选项参数
参数 | 作用 |
---|---|
-f | 循环读取 |
-q | 不显示处理信息 |
-v | 显示详细的处理信息 |
-c<数目> | 显示的字节数 |
-n<行数> | 显示行数 |
–pid=PID | 与-f合用,表示在进程ID,PID死掉之后结束 |
-q, --quiet, --silent | 从不输出给出文件名的首部 |
-s, --sleep-interval=S | 与-f合用,表示在每次反复的间隔休眠S秒 |
(4)案例演示
任务1、显示文件最后4行内容
- 执行命令:
tail -n 4 anaconda-ks.cfg
任务2、显示文件最后4个字符内容
- 执行命令:
tail -c 4 love.txt
- 为什么只看到三个字符
you
呢,还有一个看不见的结束符。
任务3、显示文件修改行
- tail -f filename 显示文件修改的内容。
- 说明:监视filename文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。
- 查看test.txt内容
- 修改
test.txt
,在末尾增加10换行内容,然后存盘退出
- 在实际应用中,日志文件在不断修改,如何显示修改的内容呢?只需要参数
-f
。针对刚才修改过的test.txt
文件,怎么显示出修改(插入)的新内容呢?
思考题:如何给出test.txt
文件的行数?
- 方法一、用vim编辑
test.txt
文件,在命令模式下按G
键定位到最后一行
- 方法二、用vim编辑
test.txt
文件,在末行模式下设置行号:set nu
- 方法三、利用
cat -n
命令显示test.txt
文件内容
- 方法四、利用
wc -l
命令统计文件行数 - 执行命令:
wc -l test.txt
,统计文件行数
- 执行命令:
wc -c test.txt
,统计文件字符数
- 执行命令:
wc -w test.txt
,统计文件单词个数
6、sort命令
(1)命令概述
- Linux sort 命令用于将文本文件内容加以排序。sort 可针对文本文件的内容,以行为单位来排序。
(2)命令格式
- sort [选项参数] 文件
(3)选项参数
参数 | 作用 |
---|---|
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t <分隔字符> | 指定排序时所用的栏位分隔字符 |
-k field1[,field2] | 按指定的列进行排序 |
(4)案例演示
- 预备工作:创建ips.txt文件
任务1、对文件按行排序
-
执行命令:
sort ips.txt
,按字典排序法升序排列
-
执行命令:
sort -r ips.txt
,按字典排序法降序排列
任务2、对文件按第4节排序
- 执行命令:
sort -t '.' -k 4 ips.txt
,升序排列
- 执行命令:
sort -t '.' -k 4 -r ips.txt
,降序排列
7、cut命令
(1)命令概述
- cut命令就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
(2)命令格式
- cut [选项参数] 文件名
(3)参数说明
参数 | 说明 |
---|---|
-b | (byte)以字节为单位进行分割 |
-c | (character)以字符单位取出固定字符区间 |
-d | (delimiter)分隔符,按照指定分隔符分割列,与 -f 一起使用 |
-f | (fetch)依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思(列号,提取第几列) |
(4)案例演示
任务1、提取ips.txt文件第7列字符
- 执行命令:
cut -c 7 ips.txt
- 执行命令:
cut -b 7 ips.txt
任务2、提取ips.txt文件第4节内容
- 执行命令:
cut -d '.' -f 4 ips.txt
,提取第4节内容
- 执行命令:
cut -d '.' -f 2 ips.txt
,提取第2节内容
课堂练习:提取汉字文件内容
- 提取第7列
- 提取第3节
8、history命令
(1)命令概述
- Linux中
history
命令主要用于显示历史指令记录内容, 下达历史纪录中的指令。读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。
(2)命令格式
- history [选项参数]
(3)参数说明
参数 | 说明 |
---|---|
-n | 打印最近的n条历史命令 |
-N | 显示历史记录中最近的N个记录 |
-c | 清空当前历史命令 |
-a | 将目前新增的历史指令新增入histfiles 中,若没有加histfiles ,则预设写入~/.bash_history |
-r | 将历史命令文件中的命令读入当前历史命令缓冲区 |
-w | 将当前历史命令缓冲区命令写入历史命令文件中 |
-d <offset> | 删除历史记录中第offset个命令 |
-n <filename> | 读取指定文件 |
(4)案例演示
任务1、查看历史操作记录
- 执行命令:
history
任务2、查看最近10条历史命令
- 执行命令:
history 10
(写成history -n 10
也是一样效果)
任务3、查看最开始10条历史命令
- 执行命令:
history | head -10
任务4、曾多少次使用vim编辑文本文件?
- 执行命令:
history | grep vim
任务5、执行历史第5条命令
- 查看历史第5条命令
- 执行命令:
!5
任务6、执行上一条命令
- 执行命令:
!!
任务7、执行最后一次以his开头的命令
- 执行命令:
!his
!<字符串>
,字符串随便输入,shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。
任务8、将当前历史命令缓冲区命令写入历史命令文件中
- 执行命令:
history -w myhis
- 执行命令:
cat myhis | tail -5
任务9、 清除第5条历史命令
- 查看第5条历史明令
- 执行命令:
history -d 5
- 检查一下原来的第5条历史还是否存在
任务10、清除所有历史命令
- 执行命令:
history -c
- 此命令发布之后,按上方向键就不能调出历史命令了。
任务11、将历史命令文件中的命令读入当前历史命令缓冲区
- 执行命令:
history -r myhis
- 执行命令:
history | head -10
- 观察一下,读取历史命令文件后,以前的命令进入当前命令缓冲区,但是插入的第1条命令是刚才读取历史命令文件的命令。
(三)shell脚本
- 注意:脚本文件第一行必须是
#!/bin/bash
,指定命令解释器bash
1、执行shell脚本
-
创建脚本文件,执行命令:
vim /home/shell.sh
-
此时,
shell.sh
对于所有者而言,只有读和写的权限,并不是可执行的脚本。
(1)直接执行脚本
- shell.sh文件必须具备可读与可执行(rx) 的权限
- 增加shell.sh的写权限,执行命令:
chmod u+x /home/shell.sh
绝对路径方式执行脚本
- 执行命令:
/home/shell.sh
相对路径方式执行脚本
- 执行命令:
cd /home
- 执行命令:
./shell.sh
(.
表示当前目录)
(2)利用source命令执行脚本
- 执行命令:
source shell.sh
(3)利用bash或sh命令执行脚本
- 执行命令:
bash shell.sh
- 执行命令:
sh shell.sh
2、shell脚本实战
任务1、显示当前用户主目录
1)编写脚本
- 执行命令:
vim shell01.sh
2)设置权限
- 执行命令:
chmod u+x shell01.sh
,增加可执行权限
3)执行脚本
- 执行命令:
./shell01.sh
- 切换到其他用户,看一看是否能够执行该脚本呢?
- 为了让其他用户(howard)能执行该脚本,那么应该修改权限,让其他人也有执行权限
- 首先退出howard用户环境,返回到root用户环境,执行命令:
chmod o+x shell01.sh
- 此时切换到howard用户,看是否有权限执行脚本
任务2、编程实现两个数相乘
1)编写脚本
- 执行命令:
vim shell02.sh
#/bin/bash
read -p "a = " a
read -p "b = " b
product=$((a*b))
echo "$a * $b = $product"
2)设置权限
- 执行命令:
chmod u+x shell02.sh
3)执行脚本
- 执行命令:
./shell02.sh
三、归纳总结
- 回顾本节课所讲的内容,并通过提问的方式引导学生解答问题并给予指导。
四、上机操作
- 形式:单独完成
- 题目:使用shell命令和shell脚本
- 要求:按照讲课笔记来完成任务,截图记录操作步骤,写一篇CSDN博客
课堂练习1
- 按照讲课笔记使用sed命令
- 按照讲课笔记使用sort命令
- 按照讲课笔记使用cut命令
- 按照讲课笔记使用history命令
课堂练习2
- 创建shell脚本,完成两个整数的四则运算
- 输入和输出格式按照讲课笔记里的乘法脚本
五、拓展学习
(一)test命令
1、参数说明
(1)判断文件存在性
参数 | 作用 |
---|---|
-e | (exist)判断文件是否存在 |
(2)判断文件类型
参数 | 作用 |
---|---|
-f | (file)判断是否为文件并且存在 |
-d | (directory)判断是否为目录并且存在 |
-b | (block device)判断是否为块设备并且存在 |
-c | (character device)判断是否是字符设备并且存在 |
-S | (Socket)判断是否为Socket文件并且存在 |
-p | (pipe)判断是否为pipe文件并且存在 |
-L | (link)判断是否为链接文件并且存在 |
(3)判断文件权限
参数 | 作用 |
---|---|
-r | (readable)检查该文件是否存在且具有可读的权限 |
-w | (writable)检查该文件是否存在且具有可写的权限 |
-x | (executable)检查该文件是否存在且具有可执行的权限 |
-s | 检查该文件是否存在且为非空文件 |
-u | 检查该文件名是否存在且具有SUID的属性 |
-g | 检查该文件名是否存在且具有SGID的属性 |
(4)判断字符串
命令 | 作用 |
---|---|
test -z string | 判断字符串是否为空 |
test -n string | 判断字符串是否为非空 |
test str1=str2 | 判断两个字符串是否相等 |
test str1!=str2 | 判断两个字符串是否不相等 |
(5)判断两个文件
命令 | 作用 |
---|---|
test file1 -nt file2 | 判断file1 是否比file2 新 (nt: newer than) |
test file1 -ot file2 | 判断file1 是否比file2 旧 (ot: older than) |
test file1 -ef file2 | 判断两个文件是否为同一个文件(ef: equal file) |
2、案例演示
任务1、输入文件,对文件进行判断
- 先给予提示:“请输入文件名:”
- 判断是否输入文件名,如果为空提示:“你必须输入文件名!”,并结束脚本
- 判断文件是否存在?不存在则结束脚本
- 判断文件类型以及统计文件都有哪些权限
- 输出文件类型和文件所有的权限
1)编写脚本
- 执行命令:
vim shell03.sh
#!/bin/bash
# 功能:输入文件名,输出文件类型与权限
echo "输入文件名,检查文件是否存在。如果文件存在,那么返回文件类型与权限。"
read -p "请输入文件名:" filename
test -z $filename && echo "文件名不能为空!" && exit 1
test ! -e $filename && echo "[$filename]文件不存在!" && exit 2
test -f $filename && filetype="文件"
test -d $filename && filetype="目录"
test -L $filename && filetype="链接"
test -r $filename && perms="可读"
test -w $filename && perms="$perms 可写"
test -x $filename && perms="$perms 可执行"
echo "类型:$filetype"
echo "权限: $perms"
2)设置权限
- 执行命令:
chmod u+x shell03.sh
3)执行脚本
- 执行命令:
./shell03.sh
,测试各种情况
任务2、判断两个文件的新旧与异同
- 准备工作:创建test1.txt与test2.txt两个文件
1)编写脚本
- 执行命令:
vim shell04.sh
#!/bin/bash
test test1.txt -nt test2.txt && echo test1.txt比test2.txt新
test test1.txt -ot test2.txt && echo test1.txt比test2.txt旧
test test1.txt -ef test2.txt && echo test1.txt与test2.txt相同
test ! test1.txt -ef test2.txt && echo test1.txt与test2.txt不同
2)设置权限
- 执行命令:
chmod u+x shell04.sh
3)执行脚本
- 执行命令:
./shell04.sh
(二)判断符号[]
1、命令格式
- [ XXXX ],注意[ ]和脚本XXXX之间保留空格
2、注意事项
(1)字符串比较
==
和!=
用于比较字符串,注意==
,!=
两边必须有空格
(2)整数比较
- 整数比较只能使用-eq, -gt, -ge, -lt, -le这种形式
- -eq: equal
- -gt: greater than
- -ge: greater than or equal to
- -lt: less than
- -le: less than or equal to
(3)逻辑运算符
- [ ]中的逻辑与和逻辑或使用-a 和-o 表示(-a: and, -o: or)
- &&、||、<和>操作符如果出现在[ ]结构中的话,会报错。
2、案例演示
任务:根据用户输入执行不同操作
1)编写脚本
- 执行命令:
vim shell05.sh
#!/bin/bash
read -p "你是否要保存文件[Y/N]?" choice
[ $choice == 'y' -o $choice == 'Y' ] && echo "文件已保存!" && exit 0
[ $choice ==以上是关于大数据讲课笔记1.8 shell基础的主要内容,如果未能解决你的问题,请参考以下文章