shell入门之道

作者: 无字天书 | 来源:发表于2019-04-29 14:18 被阅读35次

一前言

1.1什么是shell?

Shell是在Linux内核与用户之间的解释器程序,通常指的是bash,负责向内核翻译及传达用户/程序指令

shell的使用方式:

1.交互执行指令:人工干预,执行效率低。

2.非交互执行指令:安静地在后台执行,执行效率高,方便写脚本。

2.2shell解释器

/bin/sh

/bin/bash                                   #默认解释器

/sbin/nologin                            #禁止用户登陆

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin                      #禁止用户登陆

/bin/tcsh

/bin/csh

/bin/ksh

/bin/rksh

提示:修改默认解释器,在创建(修改)用户指定默认解释器

2.3执行注意事项

bash     test.sh                #打开子进程执行程序

./test.sh                           #打开子进程执行程序

source  test.sh                #不打开子进程执行程序

例子:

#vim test.sh

#!/bin/bash

sleep 1000

二语法

2.1重定向

标准输入(stdin),描述号为0;

标准输出(stdout),描述号为1;

标准错误(stderr),描述号为2;

>   :可重定向正确信息

>> :可实现追加正确信息

2>  :可重定向错误信息

2>>  :可实现追加错误信息

&> :可重定向错误和正确信息

>&2  :将输出信息转换为错误输出( 即$? != 0)

例子1:

[root@server0 ~]# ls /etc/hosts nm.txt >1.txt 2>2.txt

[root@server0 ~]# cat 1.txt

/etc/hosts

[root@server0 ~]# cat 2.txt

ls:无法访问nm.txt: 没有那个文件或目录

例子2:

交互式发邮件

[root@server0 ~]# mail -s tile root

非交互式发邮件

[root@server0 ~]# mail -s title root < /etc/passwd

2.2变量

掌握并熟悉Shell变量的使用,主要练习或验证下列内容:

定义/赋值/查看变量

环境/预定义/位置变量的应用

除了学会建立和引用变量以外,还要认识环境变量PWD、USER、HOME、SHELL,还有预定义变量$0、$$、$?、$#、$*,以及位置变量$1、$2、$10、……的作用。

2.2.1环境变量

[root@server0 ~]# env                                        #查看当前系统自带的环境变量

[root@server0 ~]# set                                         #查看当前系统定义的环境变量(系统自带,自己定义的)

USER:代表当前用户

HOME:输出当前用户家目录

SHELL:代表当前用户所用的解释器

PWD:当前目录位置

UID:当前用户的uid

PATH:

PS1:设置提示

例子:

[root@server0 ~]# PS1=[强哥]#

[强哥]#exit

[root@server0 ~]# echo $PS1

[\u@\h \W]\$

[root@server0 ~]# echo $PS2

>

2.2.2预定义变量

$$:当前进程的进程号

$?:输出上一个程序的返回状态码

$#:统计参数的个数

$*:代表所有参数变量的值

$$ :Shell本身的PID(ProcessID)

$!:Shell最后运行的后台Process的PID

$?:最后运行的命令的结束代码(返回值)

$-:使用Set命令设定的Flag一览

$*:所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$@:所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$#:添加到Shell的参数个数

$0:Shell本身的文件名

$1~$n:添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

例子:

echo $0                                        //脚本的名称

echo $1                                        //第一个参数

echo $2                                        //第二个参数

echo $*                                        //所有参数

echo $#                                        //所有的综合

echo $$                                        //当前进程的进程号

echo $?                                        //上一个程序的返回状态码

2.2.3位置变量

$n:表示第几个参数变量

提示:${10}不能写成$10   $10=${1}0

例子:

[root@svr5 ~]#./test.sh  a b c d

即 $1=a,$2=b,$3=c,$4=d

2.2.4变量的定义/赋值/查看/引用

1,新建/赋值变量

新建变量test,赋值“hello world”,通过set命令可以检查变量设置:

[root@svr5 ~]# test=11

2,查看变量

通过echo $变量名 可输出变量值:

[root@svr5 ~]# echo $test

11

提示:

查看变量时,若变量名称与后面要输出的字符串连在一起,则应该以{}将变量名括起来以便区分。

[root@svr5 ~]# echo $testRMB              //无法识别变量名test

[root@svr5 ~]# echo ${test}RMB              //区分后可以识别

11RMB

3,撤销自定义变量

若要撤销已有的变量,可使用unset命令:

[root@svr5 ~]# unset test                  //撤销变量test

[root@svr5 ~]# echo $test                  //查看时已无结果

4,引用

变量的引用使用$符号,多字符需要用{}引起来

例子:

[root@svr5 ~]# test=123

[root@svr5 ~]# echo ${test}520

123520

2.2.5三种引号对变量赋值的影响

1,双引号的应用

使用双引号可以界定一个完整字符串。

2,单引号的应用

界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能。

3,反撇号或$()的应用

使用反撇号或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。

[root@svr5 ~]# tar -czf log-`date +%Y%m%d`.tar.gz /var/log

2.3 read基本用法

应用于执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量str

为了不至于使用户不知所措、莫名其妙,推荐的做法是结合-p选项给出友好提示。

例子:

[root@svr5 ~]# read -p "请输入一个整数:" i

请输入一个整数:240

[root@svr5 ~]# echo $i

240

2.4stty终端显示控制

将回显功能关闭(stty -echo)

将回显功能恢复(stty echo)

例子:

[root@svr5 ~]# vim user.sh              //创建一个测试脚本

#!/bin/bash

read -p "请输入用户名:"  username              //读取用户名

stty -echo                                  //关闭回显

read -p "请输入密码:"  passwd              //读取密码

stty echo                                  //恢复回显

echo ""                                      //恢复回显后补一个空行

useradd "$username"

echo "$passwd" | passwd --stdin "$username"

[root@svr5 ~]# chmod +x user.sh          //添加执行权限

执行测试脚本user.sh,验证效果:

[root@svr5 ~]# ./user.sh

请输入用户名:  root                          //输入root,回车

请输入密码:                                   //输入1234567(不会显示),回车

2.5 export

功能:定义全局变量

2.6Shell中的数值运算

使用expr、$[ ]、let等整数运算工具:定义变量X=1234,然后计算X与78的四则运算及求模结果

使用bc实现小数运算操作:以交互方式计算12.34与56.78的四则运算结果,另外再以非交互方式重复上述计算,最多显示4位小数

2.6.1整数运算工具

1,使用expr命令

乘法操作应采用\*转义,避免被作为Shell通配符;参与运算的整数值与运算操作符之间需要以空格分开,引用变量时必须加$符号。

首先定义变量X=1234,然后分别计算与78的加减乘除和求模运算结果:

[root@svr5 ~]# X=1234                              //定义变量X

[root@svr5 ~]# expr  $X  +  88                      //加法

1322

[root@svr5 ~]# expr  $X  -  88                       //减法

1146

[root@svr5 ~]# expr  $X  \*  78                      //乘法,操作符应添加\转义

96252

[root@svr5 ~]# expr  $X  /  78                      //除法,仅保留整除结果

15

[root@svr5 ~]# expr  $X  %  78                     //求模

64

2,使用$[]或$(())表达式

乘法操作*无需转义,运算符两侧可以无空格;引用变量可省略 $ 符号;计算结果替换表达式本身,可结合echo命令输出。

同样对于变量X=1234,分别计算与78的加减乘除和求模运算结果:

[root@svr5 ~]# X=1234   

[root@svr5 ~]# echo $[X+78]

1312

[root@svr5 ~]# echo $[X-78]

1156

[root@svr5 ~]# echo $[X*78]

96252

[root@svr5 ~]# echo $[X/78]

15

[root@svr5 ~]# echo $[X%78]

64

[root@server0 ~]# echo $[x**2]                               #x=20   ,20的2次幂

400

3,使用let命令

expr或$[]、$(())方式只进行运算,并不会改变变量的值;而let命令可以直接对变量值做运算再保存新的值。因此变量X=1234,在执行let运算后的值会变更;另外,let运算操作并不显示结果,但是可以结合echo命令来查看:

[root@svr5 ~]# X=1234  

[root@svr5 ~]# let y=X+22

[root@svr5 ~]# echo $y

1256

[root@svr5 ~]# let X++;  echo $X        # X++(X=X+1)

[root@svr5 ~]# let X--;  echo $X        # X--(X=X-1)

[root@svr5 ~]# let X+=78 ; echo $X        # X+=78(X=X+78)

[root@svr5 ~]# let X-=78 ; echo $X     # X-=78(X=X-78)

[root@svr5 ~]# let X*=78 ; echo $X     # X*=78(X=X*78)

[root@svr5 ~]# let X/=78 ; echo $X     # X/=78(X=X/78)

[root@svr5 ~]# let X%=78 ; echo $X     # X%=78(X=X%78)

2.6.2小数运算工具

1,bc交互式运算

先执行bc命令进入交互环境,然后再输入需要计算的表达式。以计算小数12.34与5.678的四则运算为例,相关操作如下:

[root@svr5 ~]# 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'.

12.34+56.78                                        //加法

69.12

12.34-56.78                                        //减法

-44.44

12.34*56.78                                        //乘法

700.66

12.34/56.78                                        //除法

0

quit                                              //退出交互计算器

[root@svr5 ~]#

2,bc非交互式运算

将需要运算的表达式通过管道操作交给bc运算。注意,小数位的长度可采用scale=N限制,除此以外也受参与运算的数值的小数位影响。以计算小数12.34与5.678的四则运算为例,相关操作如下:

[root@svr5 ~]# echo 'scale=4;12.34+5.678' | bc

18.018

[root@svr5 ~]# echo 'scale=4;12.34*5.678' | bc

70.0665

[root@svr5 ~]# echo 'scale=4;12.34/5.678' | bc

2.1733

2.7条件测试

字符串匹配

比较整数值的大小

识别文件/目录的状态

多个条件/操作的逻辑组合

2.7.1语法格式

使用“test表达式”或者[ 表达式 ]都可以,表达式两边至少要留一个空格。

条件测试操作本身不显示出任何信息。测试的条件是否成立主要体现在命令执行后的返回状态(即$?),所以可以在测试后查看变量$?的值来做出判断,或者结合&&、||等逻辑操作显示出结果(或作其他操作) 。

==: 比较两个字符串是否相同

!=:比较两个字符串是否不相同

1,行执行多条命令的情况

# A && B                        //仅当A命令执行成功,才执行B命令

# A || B                        //仅当A命令执行失败,才执行B命令

# A ;  B                        //执行A命令后执行B命令,两者没有逻辑关系

-z检查变量的值是否未设置(空值)

[root@svr5 ~]# var1="nb" ; var2=""

[root@svr5 ~]# [ -z "$var1" ] && echo "空值" || echo "非空值"

非空值

[root@svr5 ~]# [ -z $var2 ] && echo "空值" || echo "非空值"

空值//变量var2已设置,但无任何值,视为空

2,整数值比较

-eq:比较两个数是否相等

-ne:比较两个数是否不相等

-gt:比较前面的整数是否大于后面的整数

-ge:比较前面的整数是否大于或等于后面的整数

-lt:比较前面的整数是否小于后面的整数

-le:比较前面的整数是否小于或等于后面的整数

3,识别文件/目录的状态

-e:判断对象是否存在(不管是目录还是文件)

-d:判断对象是否为目录(存在且是目录)

-f:判断对象是否为文件(存在且是文件)

-r:判断对象是否可读

-w:判断对象是否可写

-x:判断对象是否具有可执行权限

4,多个条件/操作的逻辑组合

--&&,逻辑与

给定条件必须都成立,整个测试结果才为真。

--||,逻辑或

只要其中一个条件成立,则整个测试结果为真。

2.8条件,循环

2.8.1 if

if条件测试|命令

fi

if条件测试

then

命令序列1

else  

命令序列2

fi

if条件测试1 ;then  

命令序列1

elif条件测试2 ;then  

命令序列2

else

命令序列n

fi

2.8.2for

RANDOM:产生随机数

random

for随便一个未定义变量  in  参数,列表,命令

do

done

1){a..n}  ,seq n

{1..n}=`seq n`

区别:

{}里面不能有变量,seq 后可以是变量

for num in {a..n}                       #seq  n

do

done

例子:

#!/bin/bash

for i in {1..5}

do

  for j in {1..8}

  do

echo -n "* "                          #-n不换行

  done

echo                                          #默认换行

done

echo -e  ‘ \033[32mOK\033[0m’

2)命令执行结果(值列表)

for num in命令

do

done

for num in `cat  /etc/passwd`

do

  echo $num

done

3)(C语言风格的for循环语法格式)

[root@svr5 ~]# vim cfor.sh

#!/bin/bash

for ((i=1;i<=5;i++))

do

   echo $i

done

4)break,continue,exit

2.8.3while

while条件测试

do

命令

done

常用死循环格式

while :

do

命令

done

2.8.4case

格式:

case变量值 in

模式1|模式5|模式6)

命令1;;

模式2)

命令2;;

*)

命令21

esac

2.9设置输出字体颜色

echo -e “\033[32mOK\033[0m”

0x: 样式

3x:字体色                      #31红色,32绿色

4x:背景色

10x:高亮色

2.10函数

unset函数名                              #取消函数名

wait :等待该脚本的程序执行完结束后回到命令行

语法格式:

1)标准格式

function函数名(){

n命令序列

}

2)常用

函数名(){

n命令序列

}

2.11字符串

2.11.1字符串初值的处理

${var:-word}

若变量var已存在且非Null,则返回 $var 的值;否则返回字串“word”,原变量var的值不受影响

2.11.2字符串统计个数

[root@room9pc01 ~]# p=123456

[root@room9pc01 ~]# echo ${#p}                     #统计变量长度

6

2.11.3子串截取的三种用法

1)${变量名:起始位置:长度}

提示:使用${}方式截取字符串时,起始位置是从0开始的

例子:

[root@room9pc01 ~]# p=123456

[root@room9pc01 ~]# echo ${#p}

6

[root@room9pc01 ~]# echo ${p:1:3}

234

2)expr substr "$变量名" 起始位置 长度

提示:使用expr substr截取字符串时,起始编号从1开始,这个要注意与${}相区分

例子:

[root@room9pc01 ~]# p=123456789

[root@room9pc01 ~]# expr substr "$p" 1 5

12345

3)echo $变量名 | cut -b 起始位置-结束位置

提示:选项-b表示按字节截取字符,其中起始位置、结束位置都可以省略。当省略起始位置时,视为从第1个字符开始(编号也是从1开始,与expr类似),当省略结束位置时,视为截取到最后。

例子:

[root@room9pc01 ~]# echo $p

123456789

[root@room9pc01 ~]# echo $p | cut -b 1-5

12345

[root@room9pc01 ~]# echo $p | cut -b 3-5

345

[root@room9pc01 ~]# echo $p | cut -b 3,5-6,8          #位置可连续,也可间断

3568

2.11.4子串替换的两种用法

1)只替换第一个匹配结果:${变量名/old/new}

2)替换全部匹配结果:${变量名//old/new}

例子:

[root@VM_0_2_centos ~]# name=55668855

[root@VM_0_2_centos ~]# echo ${name/5/cc}

cc5668855

[root@VM_0_2_centos ~]# echo ${name//5/cc}

cccc6688cccc

2.11.5字符串掐头去尾

1)从左向右,最短匹配删除:${变量名#*关键词}

[root@room9pc01 ~]# echo $A

root:x:0:0:root:/root:/bin/bash

[root@room9pc01 ~]# echo ${A#*:}

x:0:0:root:/root:/bin/bash

2)从左向右,最长匹配删除:${变量名##*关键词}

[root@room9pc01 ~]# echo $A

root:x:0:0:root:/root:/bin/bash

[root@room9pc01 ~]# echo ${A##*:}

/bin/bash

3)从右向左,最短匹配删除:${变量名%关键词*}

[root@room9pc01 ~]# echo $A

root:x:0:0:root:/root:/bin/bash

[root@room9pc01 ~]# echo ${A%:*}

root:x:0:0:root:/root

4)从右向左,最长匹配删除:${变量名%%关键词*}

[root@room9pc01 ~]# echo $A

root:x:0:0:root:/root:/bin/bash

[root@room9pc01 ~]# echo ${A%%:*}

root

2.12expect预期交互

实现SSH登录的自动交互

expect可以为交互式过程(比如FTP、SSH等登录过程)自动输送预先准备的文本或指令,而无需人工干预。触发的依据是预期会出现的特征提示文本

#yum -y install expect

1)<<

[root@room9pc01下载]# mail -s jluo root << EOF

> dfsg

> dgsd

> dgs

> EOF

2)非交互命令

ip=192.168.4.10

expect << EOF

spawn ssh "$ip"

expect "password" { send "123456\n" }          #必须用双引号

expect "#"        { send "touch /test.txt\n"}

expect "#"        { send "exit \n"}

EOF

提示:必须要用双引号,单引号会出错

2.13正则表达式

基本正则兼容性强,几乎所有的软件都支持,书写麻烦

扩展正则兼容性差

例子:

[root@room9pc01 shell-test]# egrep "the\b" test/a.txt

the sdfsdfsdfsf

dfsfsdf dsfsthe dfsdfdffg

gfgdg gfdfg the fgfgdf

[root@room9pc01 shell-test]# egrep "\bthe\b" test/a.txt

the sdfsdfsdfsf

gfgdg gfdfg the fgfgdf

2.14sed

Stream Editor流式编辑器

特点:

非交互式,基于模式匹配过滤及修改文本

逐行处理,并将结果输出到屏幕

可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作

2.14.1用法

用法1:前置命令 | sed  [选项]  '条件指令'

用法2:sed  [选项]  '条件指令'  文件.. ..

条件可以是行号或者/正则/

没有条件时,默认为所有条件

指令可以是增、删、改、查等指令

默认sed会将所有输出的内容都打印出来,可以使用-n屏蔽默认输出

选项中可以使用-r选项,让sed支持扩展正则

1,认识sed工具的基本选项

sed命令的常用选项如下:

-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)

-r(让sed支持扩展正则)

-i(sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)

2,常用的动作指令(条件指令)

p:打印行

d:删除行

s:字符替换

注意:替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径

3,sed工具的多行文本处理操作

i: 在指定的行之前插入文本  insert   

a:在指定的行之后追加文本  append

c:替换指定的行                    

r:读取

w:另存

例子:

##

[root@room9pc01 shell-test]# sed '2r user.txt' test.txt

              hello

2017 2011 2018

aa

bb

2017 2017 2024

2017 2017 2017

2245fdsfdf

##

[root@room9pc01 shell-test]# sed 'w user' test.txt

              hello

2017 2011 2018

2017 2017 2024

2017 2017 2017

2245fdsfdf

[root@room9pc01 shell-test]# cat user

              hello

2017 2011 2018

2017 2017 2024

2017 2017 2017

2245fdsfdf

##

[root@room9pc01 shell-test]# sed '2w user' test.txt

              hello

2017 2011 2018

2017 2017 2024

2017 2017 2017

2245fdsfdf

[root@room9pc01 shell-test]# cat user

2017 2011 2018

##

[root@svr5 ~]# sed  '3,5d' a.txt             //删除第3~5行

[root@svr5 ~]# sed  '/xml/d' a.txt            //删除所有包含xml的行

[root@svr5 ~]# sed  '/xml/!d' a.txt         //删除不包含xml的行,!符号表示取反

[root@svr5 ~]# sed  '/^install/d' a.txt    //删除以install开头的行

[root@svr5 ~]# sed  '$d' a.txt                //删除文件的最后一行

[root@svr5 ~]# sed  '/^$/d' a.txt             //删除所有空行

##

1~2p:1 1+2=3 3+3=5 …..

2~2p:2 2+2=4 4+2=6 …..

打印奇数行:

[root@svr5 ~]# sed -n '1~2p' /etc/passwd

打印偶数行:

[root@svr5 ~]# sed -n '2~2p' /etc/passwd

##

[root@room9pc01 shell-test]# sed -n 's#/bin/bash#/sbin/sh#gp' passwd

root:x:0:0:root:/root:/sbin/sh

Student:x:1000:1000::/home/Student:/sbin/sh

xiaohei:x:1002:1001::/sbin/nologin:/sbin/sh

注意:替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径

##

[root@svr5 ~]# vim anonftp.sh

#!/bin/bash

yum -y install vsftpd                             //安装vsftpd软件

cp /etc/vsftpd/vsftpd.conf{,.bak}                  //备份默认的配置文件

sed -i "s/^#anon/anon/" /etc/vsftpd/vsftpd.conf      //修改服务配置

chmod 777 /var/ftp/pub                              //调整目录权限

systemctl start vsftpd                              //启动服务

systemctl enable vsftpd                            //设为自动运行

[root@svr5 ~]# chmod +x anonftp.sh

[root@svr5 ~]# ./anonftp.sh

4,sed复制剪切

H:模式空间 –[追加] -->保持空间

h:模式空间 –[覆盖] -->保持空间

G:保持空间 –[追加] -->模式空间

g:保持空间 –[覆盖]  -->模式空间

例子:

##

[root@room9pc01 shell-test]# sed '2h;5g' 10.txt

1

2

3

4

2

6

7

8

9

10

##

[root@room9pc01 shell-test]# sed '2H;5G' 10.txt

1

2

3

4

5

2

6

7

8

9

10

##

[root@room9pc01 shell-test]# sed '2h;5G' 10.txt

1

2

3

4

5

2

6

7

8

9

10

2.15awk

awk编程语言/数据处理引擎

Aho Weinberger Kernighan

特点:

通常用在shell脚本中,获取指定的数据

单独使用时,可对文本数据做统计

用于过滤数据

逐行处理

2.15.1用法

格式1:前置命令 | awk [选项] ‘[条件]{指令}’

格式2:awk [选项] ‘[条件]{指令}’  文件….

提示:引号只能是单引号

2.15.2基本操作方法

格式:awk [选项] '[条件]{指令}' 文件

其中,print是最常用的编辑指令;若有多条编辑指令,可用分号分隔。

Awk过滤数据时支持仅打印某一列,如第2列、第5列等。

处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。

[root@svr5 ~]# df -h | awk '{print $4}'        //打印磁盘的剩余空间

2.15.3选项 -F 可指定分隔符

[root@svr5 ~]# awk -F: '{print $1,$7}' /etc/passwd

root /bin/bash

bin /sbin/nologin

daemon /sbin/nologin

awk还识别多种单个的字符,比如以“:”或“/”分隔,输出第1、10个字段

[root@svr5 ~]# awk -F [:/] '{print $1,$10}' /etc/passwd

root bash

bin nologin

daemon nologin

adm sbin

… …

2.15.4awk常用内置变量

$0文本当前行的全部内容

$1 文本的第1列

$2 文件的第2列

$3 文件的第3列,依此类推

NR 文件当前行的行号

NF 文件当前行的列数(有几列)

2.15.5awk处理的时机

BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次

{ } 逐行处理,读取文件过程中执行,指令执行n次

END{ } 行后处理,读取文件结束后执行,指令执行1次

格式:awk ‘BEGIN{}条件{}END{}’

提示:字符串里面要用双引号

输出信息时,可以使用“\t”显示Tab制表位:

##

[root@room9pc01 shell-test]# awk -F: 'BEGIN{print "User","UID","Home"}{print $1,$3,$6}END{print "Total",NR,"lines"}' /etc/passwd | column -t

User                 UID    Home

root                 0      /root

bin                  1      /bin

daemon               2      /sbin

column -t:把数据对齐显示

##

[root@room9pc01 shell-test]# awk 'BEGIN{print "begin"}{}END{print "end"}' test.txt  

begin

end

##

[root@room9pc01 shell-test]# awk "BEGIN{x=0}/bash$/{x++}END{print x}" /etc/passwd

3

2.15.6awk处理条件

##正则设置条件

输出账户名称包含root的基本信息(第1列包含root):

[root@svr5 ~]# awk -F: '$1~/root/' /etc/passwd

输出其中登录Shell不以nologin结尾(对第7个字段做!~反向匹配)的用户名、登录Shell信息:

[root@svr5 ~]# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd

root /bin/bash

sync /bin/sync

shutdown /sbin/shutdown

##数值/字符串比较设置条件

比较符号:==(等于) !=(不等于) >(大于)

>=(大于等于) <(小于) <=(小于等于)

&&    ||

2.15.7awk流程控制

if分支结构(单分支、双分支、多分支)

练习awk数组的使用

##awk过滤中的if分支结构

if (条件){

}

else if(条件){

}

else{

}

##awk数组

数组是一个可以存储多个值的变量,具体使用的格式如下:

定义数组的格式:数组名[下标]=元素值

调用数组的格式:数组名[下标]

遍历数组的用法:for(变量 in 数组名){print 数组名[变量]}。

[root@svr5 ~]# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}'

88 11

[root@svr5 ~]# awk 'BEGIN{a++;print a}'

1

[root@svr5 ~]# awk 'BEGIN{a0++;print a0}'

1

[root@svr5 ~]# awk 'BEGIN{a[0]++;print a[0]}'

1

[root@svr5 ~]# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'

0 0

1 11

2 22

注意,awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号:

[root@svr5 ~]# awk 'BEGIN{a["hehe"]=11;print a["hehe"]}'

11

2.15.8awk扩展应用

需求:

分析Web日志的访问量排名,要求获得客户机的地址、访问次数,并且按照访问次数排名

思路:

awk统计Web访问排名

在分析Web日志文件时,每条访问记录的第一列就是客户机的IP地址,其中会有很多重复的IP

地址。因此只用awk提取出这一列是不够的,还需要统计重复记录的数量并且进行排序。

通过awk提取信息时,利用IP地址作为数组下标,每遇到一个重复值就将此数组元素递增1,最

终就获得了这个IP地址出现的次数。

针对文本排序输出可以采用sort命令,相关的常见选项为-r、-n、-k。其中-n表示按数字顺序

升序排列,而-r表示反序,-k可以指定按第几个字段来排序。

统计Web访问量排名

1)提取IP地址及访问量

[ root@sv r5 ~] # awk '{ ip[ $1] ++} \

> END{ for( i in ip) { print ip[ i] ,i } } ' /var/log/httpd/access_log

4 127.0.0.1

17 192.168.4.5

13 192.168.4.110

. .. ..

2)对第1)步的结果根据访问量排名

 [ root@sv r5 ~] # awk '{ ip[ $1] ++} END{ for( i in ip) { print ip[ i],i } } ' /var/log/httpd/access_log | sort -rn

17 192.168.4.5

13 192.168.4.110

4 127.0.0.1

三总结

本次教程主要是记录shell的基本语法以及wak,sed工具的基本使用,简单易学。

温馨提示:

本次教程仅供参考,若有不足之处望方家指正,谢谢。


结束语:

更多精彩内容持续更新中,关注我,有你更精彩。

相关文章

  • shell入门之道

    一前言 1.1什么是shell? Shell是在Linux内核与用户之间的解释器程序,通常指的是bash,负责向内...

  • Shell 概述

    学习 Shell 主要包括的内容: Shell 脚本入门 Shell 变量 Shell 内置命令 Shell 运算...

  • shell基础

    shell入门

  • Shell入门笔记

    Shell脚本:Linux Shell脚本学习指南菜鸟教程 - Shell教程Linux入门 - Shell脚本是...

  • bash入门

    Bourne-Again SHell; Born Again SHell Introduction 写作“入门”,...

  • shell入门学习(1)——语法基础

    本文为转载,原文:shell入门学习(1)——语法基础 介绍 Shell Script,Shell脚本与Windo...

  • 0x01 Scala入门-基本shell交互操作

    Scala入门-基本shell交互操作

  • 2019-09-19

    Shell 概述 Shell 解析器 查看系统shell解析器 默认解析器为bash Shell 脚本入门 新建h...

  • shell脚本

    shell入门 脚本格式入门 脚本以!/bin/bash开头,指定解析器 第一个shell脚本 需求 创建shel...

  • 自动化脚本实践(Shell + Expect)

    Linux Shell脚本入门: Linux awk 命令 | 菜鸟教程 Shell 教程 | 菜鸟教程 lin...

网友评论

    本文标题:shell入门之道

    本文链接:https://www.haomeiwen.com/subject/mmgenqtx.html