Linux_shell基础编程笔记总结

本文档详细介绍了Linux Shell的基础编程,包括Shell脚本入门、变量、运算符、条件判断、流程控制、函数和常见Shell工具的使用。此外,还涵盖了企业面试中的常见问题,如空行行号查询、数据求和等。
摘要由CSDN通过智能技术生成

目录

第1章 Shell概述

第2章 Shell解析器

第3章 Shell脚本入门

1.脚本格式

2.第一个Shell脚本:helloworld

3.第二个Shell脚本:多命令处理

第4章 Shell中的变量

4.1 系统变量

1. 常用系统变量

2.案例实操

4.2 自定义变量

1.基本语法

2.变量定义规则

3.案例实操

4.3 特殊变量:$n

1.基本语法

2.案例实操

4.4 特殊变量:$#

1.基本语法

2.案例实操

4.5 特殊变量:$*、$@

1.基本语法

2.案例实操

4.6 特殊变量:$?

1.基本语法

2.案例实操

第5章 运算符

1.基本语法

2.案例实操:

第6章 条件判断

1.基本语法

2. 常用判断条件

(1)两个整数之间比较

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

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

第7章 流程控制(重点)

7.1 if 判断

1.基本语法

2.案例实操

7.2 case 语句

1.基本语法

2.案例实操

7.3 for 循环

1.基本语法1

2.案例实操:从1加到100

3.基本语法2

4.案例实操

7.4 while 循环

1.基本语法

2.案例实操

第8章 read读取控制台输入

1.基本语法

2.案例实操

第9章 函数

9.1 系统函数

1.basename基本语法

2.案例实操

3. dirname基本语法

4.案例实操

9.2 自定义函数

1.基本语法

2.经验技巧

3.案例实操

第10章 Shell工具(重点)

10.1 cut

1.基本用法

2.选项参数说明

3.案例实操

10.2 sed

1. 基本用法

2. 选项参数说明

3. 命令功能描述

4. 案例实操

10.3 awk

1. 基本用法

2. 选项参数说明【参数很多,只列出俩】

3. 案例实操

4. awk的内置变量

5. 案例实操

10.4 sort

1. 基本语法

2. 案例实操

第11章 企业真实面试题(重点)

11.1 京东

11.2 搜狐&和讯网

11.3 新浪

11.4 金和网络


第1章 Shell概述

大数据程序员为什么要学习Shell呢?

1)需要看懂运维人员编写的Shell程序。

2)偶尔会编写一些简单Shell程序来管理集群、提高开发效率。

第2章 Shell解析器

(1)Linux提供的Shell解析器有: 

[root@hadoop102 ~]# cat /etc/shells 
/bin/sh 
/bin/bash 
/usr/bin/sh 
/usr/bin/bash 
/bin/tcsh 
/bin/csh

(2)bash和sh的关系【软链接】

[root@hadoop102 bin]# ll |grep bash
-rwxr-xr-x. 1 root root      964536 4月   1 2020 bash
lrwxrwxrwx. 1 root root          10 3月   4 2022 bashbug -> bashbug-64
-rwxr-xr-x. 1 root root        6964 4月   1 2020 bashbug-64
lrwxrwxrwx. 1 root root           4 3月   4 2022 sh -> bash

(3)Centos默认的解析器是bash

[root@hadoop102 bin]# echo $SHELL
/bin/bash

第3章 Shell脚本入门

1.脚本格式

脚本以#!/bin/bash开头(指定解析器)【#不是注释,是执行的命令】

2.第一个Shell脚本:helloworld

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

(2)案例实操:

[root@hadoop102 ~]# mkdir datas
[root@hadoop102 ~]# cd datas/
[root@hadoop102 datas]# pwd
/root/datas
[root@hadoop102 datas]# touch helloworld.sh
[root@hadoop102 datas]# vim helloworld.sh 

在helloworld.sh中输入如下内容

#!/bin/bash

echo "helloworld dahaige"

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

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

sh+脚本的相对路径

[root@hadoop102 datas]# sh helloworld.sh  ---------------------sh+脚本的相对路径
helloworld dahaige
[root@hadoop102 datas]# sh /root/datas/helloworld.sh -----------------sh+脚本的绝对路径
helloworld dahaige
[root@hadoop102 datas]# bash helloworld.sh     -----------------------bash+脚本的相对路径
helloworld dahaige
[root@hadoop102 datas]# bash /root/datas/helloworld.sh  -------------bash+脚本的绝对路径
helloworld dahaige

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


[root@hadoop102 datas]# ./helloworld.sh
-bash: ./helloworld.sh: 权限不够
[root@hadoop102 datas]# ll
-rw-r--r--. 1 root root 39 12月  4 16:23 helloworld.sh
[root@hadoop102 datas]# chmod +x helloworld.sh     ------(a)首先要赋予helloworld.sh 脚本的+x权限
[root@hadoop102 datas]# ll
-rwxr-xr-x. 1 root root 39 12月  4 16:23 helloworld.sh    
[root@hadoop102 datas]# ./helloworld.sh    ---------------(b)执行脚本-相对路径
helloworld dahaige                    
[root@hadoop102 datas]# /root/datas/helloworld.sh     ----(b)执行脚本-绝对路径
helloworld dahaige

注意:

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

3.第二个Shell脚本:多命令处理

(1)需求:

在/root/目录下创建一个banzhang.txt,在banzhang.txt文件中增加“I love cls”。

(2)案例实操:

[root@hadoop102 datas]# touch batch.sh
[root@hadoop102 datas]# vim batch.sh 
#!/bin/bash

cd /root/
touch banzhang.txt
echo "I Love cls">>banzhang.txt   
[root@hadoop102 datas]# ll

-rw-r--r--. 1 root root 74 12月  4 16:42 batch.sh
-rwxr-xr-x. 1 root root 39 12月  4 16:23 helloworld.sh
 
[root@hadoop102 datas]# bash batch.sh 
batch.sh: 第 3 行:cd: /root/temp/: 没有那个文件或目录
[root@hadoop102 datas]# mkdir /root/temp/
[root@hadoop102 datas]# bash batch.sh 
[root@hadoop102 datas]# ls /root/temp/
banzhang.txt
[root@hadoop102 datas]# cat /root/temp/banzhang.txt 
I Love cls

第4章 Shell中的变量

4.1 系统变量

1. 常用系统变量

$HOME、$PWD、$SHELL、$USER等

2.案例实操

(1)查看系统变量的值

[root@hadoop102 datas]# echo $HOME
/root                                -------------当前用户家目录
[root@hadoop102 datas]# echo $PWD
/root/datas
[root@hadoop102 datas]# echo $SHELL
/bin/bash
[root@hadoop102 datas]# echo $USER
root

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

4.2 自定义变量

1.基本语法

(1)定义变量:变量=值 

(2)撤销变量:unset 变量

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

2.变量定义规则

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

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

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

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

3.案例实操

(1)定义变量A

[root@hadoop102 datas]# A=1        --------定义变量A
[root@hadoop102 datas]# echo $A
1

(2)给变量A重新赋值

[root@hadoop102 datas]# A = 2        ------------“=”两边不能有空格
bash: A: 未找到命令...
[root@hadoop102 datas]# A= 2
bash: 2: 未找到命令...
[root@hadoop102 datas]# A=2        -------------给变量A重新赋值
[root@hadoop102 datas]# echo $A
2

(3)撤销变量A

[root@hadoop102 datas]# unset A
[root@hadoop102 datas]# echo $A

[root@hadoop102 datas]# 

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

[root@hadoop102 datas]# readonly B=2
[root@hadoop102 datas]# echo $B
2
[root@hadoop102 datas]# readonly B=3        ------------只读不能更改
-bash: B: 只读变量

[root@hadoop102 datas]# unset B             ------------只读不能取消,知道虚拟机重启
-bash: unset: B: 无法反设定: 只读 variable

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

[root@hadoop102 datas]# C=1+1        ---------默认是字符串类型
[root@hadoop102 datas]# echo $C
1+1

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

[root@hadoop102 datas]# D=banzhang love mm
bash: love: 未找到命令...
[root@hadoop102 datas]# D="banzhang love mm"    ----------较长需要有空格,用双引号引起来
[root@hadoop102 datas]# echo $D
banzhang love mm

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

export 变量名

[root@hadoop102 datas]# vim helloworld.sh 
#!/bin/bash

echo "helloworld dahaige"

echo $D                -------------新添加的代码

[root@hadoop102 datas]# echo $D
banzhang love mm
[root@hadoop102 datas]# ./helloworld.sh 
helloworld dahaige

                   ----------发现并没有打印输出变量$D的值,实际缺输出为空,说明变量不是全局生效
[root@hadoop102 datas]# export D    -----------提升为全局环境变量
[root@hadoop102 datas]# ./helloworld.sh 
helloworld dahaige    
banzhang love mm        -           ----全局变量已经生效

4.3 特殊变量:$n

1.基本语法

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

2.案例实操

(1)输出该脚本文件名称、输入参数1和输入参数2 的值

[root@hadoop102 datas]# touch parameter.sh
[root@hadoop102 datas]# vim parameter.sh 

#!/bin/bash

echo "$0 $1 $2 $3"
[root@hadoop102 datas]# bash parameter.sh                      ---$0是该脚本名称
parameter.sh   
[root@hadoop102 datas]# bash parameter.sh banzhang             ---$1是第一个参数
parameter.sh banzhang  
[root@hadoop102 datas]# bash parameter.sh banzhang love        ---$显示三个参数
parameter.sh banzhang love 
[root@hadoop102 datas]# bash parameter.sh banzhang love mm     ---显示四个参数
parameter.sh banzhang love mm
[root@hadoop102 datas]# bash parameter.sh banzhang love mm 1   ---多的参数不显示
parameter.sh banzhang love mm
 

4.4 特殊变量:$#

1.基本语法

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

2.案例实操

(1)获取输入参数的个数

[root@hadoop102 datas]# vim parameter.sh 
[root@hadoop102 datas]# cat parameter.sh 
#!/bin/bash

echo "$0 $1 $2 $3"

echo $#                ----------------------------新添加的代码
[root@hadoop102 datas]# bash parameter.sh 
parameter.sh   
0
[root@hadoop102 datas]# bash parameter.sh banzhang
parameter.sh banzhang  
1
[root@hadoop102 datas]# bash parameter.sh banzhang love mm
parameter.sh banzhang love mm
3
[root@hadoop102 datas]# bash parameter.sh banzhang love mm 111 222
parameter.sh banzhang love mm
5

4.5 特殊变量:$*、$@

1.基本语法

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

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

2.案例实操

(1)打印输入的所有参数

[root@hadoop102 datas]# vim parameter.sh 

#!/bin/bash

echo "$0 $1 $2 $3"

echo $#

echo $*
echo $@
[root@hadoop102 datas]# bash parameter.sh banzhang love mm
parameter.sh banzhang love mm
3
banzhang love mm        --------$*代表命令行中所有的参数,$*把所有的参数看成一个整体
banzhang love mm        --------$@代表命令行中所有的参数,$@把每个参数区分对待

4.6 特殊变量:$?

1.基本语法

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

2.案例实操

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

[root@hadoop102 datas]# ./helloworld.sh 
helloworld dahaige
banzhang love mm
[root@hadoop102 datas]# $?    --------命令错误
bash: 0: 未找到命令...    
[root@hadoop102 datas]# echo $?    -----上条命令未正确执行,所以不为0
127
[root@hadoop102 datas]# ./helloworld.sh 
helloworld dahaige
banzhang love mm
[root@hadoop102 datas]# echo $?        ----------上条命令正确执行,返回0
0

第5章 运算符

1.基本语法

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

(2)expr  + , - , \*,  /,  %    加,减,乘,除,取余

注意:expr运算符间要有空格

2.案例实操:

(1)计算3+2的值
[root@hadoop102 ~]# expr 3+2
3+2
[root@hadoop102 ~]# expr 3 + 2
5
[root@hadoop102 ~]# expr 3 +2
expr: 语法错误
(2)计算3-2的值
[root@hadoop102 ~]# expr 3 - 2
1
(3)计算(2+3)X4的值
  (a)expr一步完成计算
[root@hadoop102 ~]# expr ( 3 + 2 ) \* 4
-bash: 未预期的符号 `3' 附近有语法错误
[root@hadoop102 ~]# expr (3 + 2) \* 4
-bash: 未预期的符号 `3' 附近有语法错误
[root@hadoop102 ~]# expr `expr 3 + 2 `\* 4
expr: 语法错误
[root@hadoop102 ~]# expr `expr 3 + 2` \* 必须严格执行,一个空格位置不对都不行。(着重号`,与~同一个按键)
20
  (b)采用$[运算式]方式
[root@hadoop102 ~]# s=$[(2+3)*4]
[root@hadoop102 ~]# echo $s
20

第6章 条件判断

1.基本语法

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

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

2. 常用判断条件

(1)两个整数之间比较

= 字符串比较

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

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

-ge 大于等于(greater equal) -ne 不等于(Not equal)

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

-r 有读的权限(read) -w 有写的权限(write)

-x 有执行的权限(execute)

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

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

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

3.案例实操

(1)23是否大于等于22

(1)23是否大于等于22
[root@hadoop102 ~]# [23 -ge 22]
bash: [23: 未找到命令...
[root@hadoop102 ~]# [ 23 -ge 22 ]
[root@hadoop102 ~]# echo $?    -------$?判断上条命令是否执行正确,正确为0,不正确为其他
0
[root@hadoop102 ~]# [ 23 -le 22 ]
[root@hadoop102 ~]# echo $?
1

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

[root@hadoop102 datas]# [ -w helloworld.sh ]
[root@hadoop102 datas]# echo $?
0
[root@hadoop102 datas]# ll

-rw-r--r--. 1 root root 11 12月  4 16:44 banzhang.txt

-rwxr-xr-x. 1 root root 48 12月  4 17:19 helloworld.sh


[root@hadoop102 datas]# [ -x banzhang.txt ]
[root@hadoop102 datas]# echo $?
1

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

[root@hadoop102 datas]# [ -e /root/datas/cls.txt ]
[root@hadoop102 datas]# echo $?
1
[root@hadoop102 datas]# [ -e /root/datas/banzhang.txt ]
[root@hadoop102 datas]# echo $?
0

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

[root@hadoop102 datas]# [ condition ] && echo OK ||echo  notok
OK
[root@hadoop102 datas]# [ condition ] && [ ] ||echo  notok
notok

第7章 流程控制(重点)

7.1 if 判断

1.基本语法

if [ 条件判断式 ];then 【中括号[]左右必须要有空格】
  程序 
fi 
或者 
if [ 条件判断式 ] 
  then 
    程序 
fi

注意事项:

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

(2)if后要有空格

2.案例实操

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

[root@hadoop102 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
[root@hadoop102 datas]# bash if.sh 
if.sh: 第 3 行:[: -eq: 期待一元表达式
if.sh: 第 5 行:[: -eq: 期待一元表达式
[root@hadoop102 datas]# bash if.sh 1
banzhang zhen shuai
[root@hadoop102 datas]# bash if.sh 2
cls zhen mei
[root@hadoop102 datas]# bash if.sh 3
[root@hadoop102 datas]# 

 

7.2 case 语句

1.基本语法

case $变量名 in 
  "值1") 
    如果变量的值等于值1,则执行程序1 
    ;; 
  "值2") 
    如果变量的值等于值2,则执行程序2 
    ;; 
  …省略其他分支… 
  *) 
    如果变量的值都不是以上的值,则执行此程序 
    ;; 
esac

注意事项:

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

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

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

2.案例实操

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

[root@hadoop102 datas]# vim case.sh

#!/bin/bash

case $1 in
1)
        echo "banzhang"
;;
2)
        echo "cls"
;;
*)
        echo "renyao"
;;
esac
[root@hadoop102 datas]# bash case.sh 1
banzhang
[root@hadoop102 datas]# bash case.sh 2
cls
[root@hadoop102 datas]# bash case.sh 3
renyao

7.3 for 循环

1.基本语法1

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

2.案例实操:从1加到100

[root@hadoop102 datas]# vim for.sh


#!/bin/bash

s=0
for((i=1;i<100;i++))
do
        s=$[$s+$i]
done

echo $s
[root@hadoop102 datas]# bash for.sh 
5050

3.基本语法2

for 变量 in 值1 值2 值3… 
  do 
    程序 
  done

4.案例实操

(1)打印所有输入参数

[root@hadoop102 datas]# vim for2.sh

#!/bin/bash

for i in $*
do
        echo "banzhang xihuan $i"
done
[root@hadoop102 datas]# bash for2.sh mm
banzhang xihuan mm
[root@hadoop102 datas]# bash for2.sh mm cls
banzhang xihuan mm
banzhang xihuan cls
[root@hadoop102 datas]# bash for2.sh mm cls xiaoze
banzhang xihuan mm
banzhang xihuan cls
banzhang xihuan xiaoze

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

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

[root@hadoop102 datas]# vim for2.sh

#!/bin/bash

for i in $*        --------------$*不加双引号时还是单独输出
do
        echo "banzhang xihuan $i"
done

for j in $@        --------------单独输出
do
        echo "banzhang xihuan $j"
done
[root@hadoop102 datas]# bash for2.sh mm cls xiaoze
banzhang xihuan mm
banzhang xihuan cls
banzhang xihuan xiaoze
banzhang xihuan mm
banzhang xihuan cls
banzhang xihuan xiaoze

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

[root@hadoop102 datas]# vim for2.sh

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

for i in "$*"        --------------加双引号后$*作为一个整体
do
        echo "banzhang xihuan $i"
done
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 

for j in "$@"        --------------单独输出
do
        echo "banzhang xihuan $j"
done
[root@hadoop102 datas]# bash for2.sh mm cls xiaoze
banzhang xihuan mm cls xiaoze    --------------------一次循环
banzhang xihuan mm               --------------------多次循环
banzhang xihuan cls
banzhang xihuan xiaoze

 

7.4 while 循环

1.基本语法

while [ 条件判断式 ] -----------注意 [ ] 空格,两边及while []中间都要有空格
  do 
    程序
  done

2.案例实操

[ 条件判断 ]不支持>=运算符,for那里是因为采用(())形式

(1)从1加到100

[root@hadoop102 datas]# vim while.sh

#!/bin/bash

s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s + $i]
        i=$[$i + 1]
done

echo $s
[root@hadoop102 datas]# bash while.sh 
5050

第8章 read读取控制台输入

1.基本语法

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

2.案例实操

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

[root@hadoop102 datas]# vim read.sh

#!/bin/bash

read -t 7 -p "input your name " NAME

echo $NAME
[root@hadoop102 datas]# sh read.sh 
input your name ----------------------------等待7秒后自动结束
[root@hadoop102 datas]# sh read.sh 
input your name banzhang
banzhang    -------------------打印输入的字符

第9章 函数

9.1 系统函数

1.basename基本语法

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

2.案例实操

(1)截取该/root/banzhang.txt路径的文件名称

[root@hadoop102 datas]# basename /root/datas/banzhang.txt 
banzhang.txt
[root@hadoop102 datas]# basename /root/datas/banzhang.txt .txt
banzhang

3. dirname基本语法

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

4.案例实操

(1)获取banzhang.txt文件的路径

[root@hadoop102 datas]# dirname /root/datas/banzhang.txt 
/root/datas

9.2 自定义函数

1.基本语法

[ function ] funname[()]
{
Action;
[return int;]
}
funname

2.经验技巧

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

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

3.案例实操

(1)计算两个输入参数的和

[root@hadoop102 datas]# vim sum.sh

#!/bin/bash

function sum()            --------------------必须先定义函数,因为从上往下执行,在下面定义看不到
{
        s=0
        s=$[$1+$2]
        echo $s
}

read -p "input your paratemer1:" p1
read -p "input your paratemer2:" p2

sum $p1 $p2
[root@hadoop102 datas]# bash sum.sh 
input your paratemer1:1
input your paratemer2:2
3

第10章 Shell工具(重点)

10.1 cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。【不改变原文件,剪切后打印输出到控制台】

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

1.基本用法

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

2.选项参数说明

选项参数

功能

-f

列号,提取第几列

-d

分隔符,按照指定分隔符分割列

3.案例实操

(0)数据准备

[root@hadoop102 datas]# vim cut.txt

dong shen
guan zhen
wo  wo
lai  lai
le  le

(1)切割cut.txt第一列

[root@hadoop102 datas]# cut -d " " -f 1 cut.txt     ---首先cut哪一个文件,,中间是命令参数
dong
guan
wo
lai
le

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

[root@hadoop102 datas]# cut -d " " -f 2,3 cut.txt 
shen
zhen
 wo
 lai
 le

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

[root@hadoop102 datas]# cat cut.txt |grep guan
guan zhen
[root@hadoop102 datas]# cat cut.txt |grep guan|cut -d " " -f 1
guan

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

[root@hadoop102 datas]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_211/bin:
[root@hadoop102 datas]# echo $PATH |cut -d : -f 3-    -----不加-是取第三列,加了-是取第三列往后所有的
/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_211/bin

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

[root@hadoop102 datas]# ifconfig ens33 |grep "inet 192"
        inet 192.168.10.102  netmask 255.255.255.0  broadcast 192.168.10.255

[root@hadoop102 datas]# ifconfig ens33 |grep "inet 192" |cut -d " " -f 10
192.168.10.102

10.2 sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

1. 基本用法

sed [选项参数]  ‘command’  filename

2. 选项参数说明

选项参数

功能

-e

直接在指令列模式上进行sed的动作编辑【多条命令时使用,单条命令不需要】

3. 命令功能描述

命令

功能描述

新增,a的后面可以接字串,在下一行出现

d

删除

s

查找并替换

4. 案例实操

(0)数据准备

[root@hadoop102 datas]# vim sed.txt

dong shen
guan zhen
wo  wo
lai  lai 

le  le

(1)将“mei nv”这个单词插入到sed.txt第二行下,打印。

[root@hadoop102 datas]# cat sed.txt 
dong shen
guan zhen
wo  wo
lai  lai

le  le
[root@hadoop102 datas]# sed "2a mei nv" sed.txt     ---2是第二行,a是参数a,代表添加【原文件不改变】
dong shen
guan zhen
mei nv            --------------------------------------直接显示
wo  wo
lai  lai

le  le

注意:文件并没有改变

(2)删除sed.txt文件所有包含wo的行

[root@hadoop102 datas]# sed "/wo/d" sed.txt         -------------参数d在后面
dong shen
guan zhen        --------------------------------包含"wo"的一行直接删除
lai  lai

le  le

(3)将sed.txt文件中wo替换为ni

[root@hadoop102 datas]# sed "s/wo/ni/g" sed.txt  ----参数s是替换,把"wo"替换成"ni",参数g是全局替换
dong shen
guan zhen
ni  ni
lai  lai

le  le

注意:‘g’表示global,全部替换

(4)将sed.txt文件中的第二行删除并将wo替换为ni

[root@hadoop102 datas]# cat sed.txt 
dong shen
guan zhen
wo  wo
lai  lai

le  le
[root@hadoop102 datas]# sed -e "2d" -e "s/wo/ni/g" sed.txt     ----多条命令用参数-e
dong shen
ni  ni
lai  lai

le  le

10.3 awk

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

1. 基本用法

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

2. 选项参数说明【参数很多,只列出俩】

选项参数

功能

-F

指定输入文件折分隔符

-v

赋值一个用户定义变量

3. 案例实操

(0)数据准备

[root@hadoop102 datas]# cp /etc/passwd ./

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

[root@hadoop102 datas]# awk -F : '/^root/ {print $7}' passwd     ------"-F"输入指定分隔符
/bin/bash

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

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

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

(3)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell;

在最后一行添加"dahaige,/bin/zuishuai"。

[root@hadoop102 datas]# awk -F : 
'BEGIN{print "user,shell"} {print $1","$7} END{print "dahaige,bin/zuishuai"}' passwd 
user,shell                                                        【只要是打印就是{print xx}】
root,/bin/bash
...


dahaige,bin/zuishuai

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

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

[root@hadoop102 datas]# awk -F : -v i=1 '{print $3+i}' passwd     ---"-F"是切,"-v"是定义一个变量
1
...

4. awk的内置变量

变量

说明

FILENAME

文件名

NR

已读的记录数

NF

浏览记录的域的个数(切割后,列的个数)

5. 案例实操

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

[root@hadoop102 datas]# awk -F : '{print FILENAME "," NR "," NF}' passwd   --文件名,行号,所在列
passwd,1,7
passwd,2,7
passwd,3,7
passwd,4,7
passwd,5,7
passwd,6,7

  (2)切割IP

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

  (3)查询sed.txt中空行所在的行号【面试题】

[root@hadoop102 datas]# cat sed.txt 
dong shen
guan zhen
wo  wo
lai  lai

le  le
[root@hadoop102 datas]# awk '/^$/ {print NR}' sed.txt     -----空行,就是/^$/
5

10.4 sort

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

1. 基本语法

sort(选项)(参数)

选项

说明

-n

依照数值的大小排序

-r

以相反的顺序来排序【倒序】

-t

设置排序时所用的分隔字符【切】

-k

指定需要排序的列【按哪一列】

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

2. 案例实操

(0)数据准备

[root@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

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

[root@hadoop102 datas]# sort -t : -nrk 2 sort.sh      "-n"按数值大小正序,"-r"倒序,
xz:50:2.3                                             "-k"指定列,"-t"按分隔符
bb:40:5.4
ss:30:1.6
bd:20:4.2
cls:10:3.5

第11章 企业真实面试题(重点)

11.1 京东

问题1:使用Linux命令查询file1中空行所在的行号【比如404,500,...过滤异常数据-数据清洗】

[root@hadoop102 datas]# awk '/^$/{print NR}' sed.txt 
5

问题2:有文件chengji.txt内容如下:

张三 40

李四 50

王五 60

使用Linux命令计算第二列的和并输出

[root@hadoop102 datas]# vim chengji.txt 
张三 40
李四 50
王五 60
[root@hadoop102 datas]# cat chengji.txt |awk -F " " '{sum+=$2} END{print sum}'
150

11.2 搜狐&和讯网

问题1:Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?

[root@hadoop102 datas]# vim exist.sh

#!/bin/bash

if [ -f file.txt ];then
        echo "文件存在"
else
        echo "文件不存在"
fi
[root@hadoop102 datas]# ./exist.sh 
文件不存在
[root@hadoop102 datas]# touch file.txt
[root@hadoop102 datas]# ./exist.sh 
文件存在

11.3 新浪

问题1:用shell写一个脚本,对文本中无序的一列数字排序

[root@hadoop102 datas]# vim test.txt

9
8
7
6
5
4
3
2
10
1
[root@hadoop102 datas]# sort -n test.txt |awk '{a+=$0;print $0}END{print "sum="a}'
1
2
3
4
5
6
7
8
9
10
sum=55

11.4 金和网络

问题1:请用shell脚本写出查找当前文件夹(/root)下所有的文本文件内容中包含有字符”shen”的文件名称

[root@hadoop102 datas]# grep -r "shen" /root/|cut -d : -f 1
/root/datas/cut.txt
/root/datas/sed.txt

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rosy.163

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值