澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:Linux正则表达式sed,shell变

2019-06-22 作者:服务器运维   |   浏览(128)

shell脚本(一)基础知识,shell脚本基础知识

shell

一、简介

1.效应:与基础进行相互

2.语言类型:解释性语言,给基础解释用

3.脚本中第一行内容:

#!/bin/bash                       那是shell脚本的首先行内容,表示用bash这么些解释器去解释下边包车型地铁剧情

#!/bin/sh                            那也足以是shell脚本的第一行内容,表示用sh那些解释器去解释上面包车型客车内容

#!/usr/bin/env bash        env表示使用相对路线,自动找bash解释器所在地点。能够消除差别版本的系统bash不一定在/usr/bin/bash那些路子下的主题材料

4.为了使脚本方便别的人阅读,一般会在开首加上小编、创立时间、邮箱、版本、描述等剧情,能够选拔以下设置火速键的点子在剧本中追加那么些音信

vim /etc/vimrc

map <F4> ms:call WESTOS()<cr>'s
function WESTOS()
        call append(0,"######################################")
        call append(1,"# Author     :vaon                   #")
        call append(2,"# Create Date:".strftime("%Y-%m-%d")."             #")
        call append(3,"# Email      :[email protected]         #")
        call append(4,"# Version    :1.0                    #")
        call append(5,"# Description:                       #")
        call append(6,"######################################")
        call append(7,"                          ")
        call append(8,"#!/usr/bin/env bash")
endfunction

#map表示影射-->按F4时调用(呼叫)WESTOS函数

#0代表第一行,1次之行...

#香艳部分strftime是多少个种类自带的函数,表示展现当前些天子   .是分隔符,表示那几个函数与其余两段内容互不影响

#上边是设定函数的艺术:

    Fucton 函数名()

    内容

    Endfunction

下一场创立二个本子使用F4键就能够在剧本最前头自动抬高以下内容:

二、基础知识

1.变量的注解${a}b

设定a=1

echo $a 会出现1,

但echo $ab就不晤面世1b,因为系统把ab当成三个变量了。

能够echo ${a}b,会冒出1b,把作为一个已定义的1

2.转义、弱引用、强引用

1)意味着转义

echo ###不会油不过生结果,可是加上 echo ###就能够现出###

2)“”表示弱引用,也能够输出###

3)‘’表示强引用,可以输出###

4)强引用和弱引用的界别

例如 $  !    ``  那个强引用会把她们作为普通内容打字与印刷到显示屏上

而弱引用会把他们就是系统变量,实践变量里的始末

还比方在弱引用中`hostname`表示施行hostname命令

而在强引用中象征输出`hostname`其一剧情

3.diff、patch

1)diff

【1】.

[[email protected] mnt]# cat file1
abcd
1234
[[email protected] mnt]# cat file2
abcd
[[email protected] mnt]# diff file1 file2
2d1
< 1234
#表示file1删除1234就和file2一样了

【2】.比较目录

diff -r 目录一 目录二

2)打补丁

建立hello文件:

vim hello

westos

建立hello.new文件:

vim hello.new

westos

456

设置自动更新工具包:

yum install patch -y

将hello.new与hello文件比较,多出的剧情做成hello.path补丁包:

diff -u hello hello.new > hello.path

用path补丁包去更新hello文件:

patch hello hello.path

查阅hello文件,已经被更新成和hello.new一样了:

cat hello

westos

456

注:如若patch前边加上-b参数表示在更新的同一时间备份原来的书文件为hello.orig

4.grep

第百分之十立一个文书:

[[email protected] mnt]# vim /mnt/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
test:ROOT:test
test:test:root
test:root:test
test:roottest:test

1)查找包蕴root子段的行

[[email protected] mnt]# grep root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:test:root
test:root:test
test:roottest:test

2)查找包括root子段的行,不区分轻重缓急写

[[email protected] mnt]# grep -i root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:ROOT:test
test:test:root
test:root:test
test:roottest:test

3)只要root开头的

[[email protected] mnt]# grep -i ^root /mnt/passwd
root:x:0:0:root:/root:/bin/bash

4)只要root结尾的

[[email protected] mnt]# grep -i root$ /mnt/passwd
test:test:root

5)以root开始和最后的行都不要。-E代表前边五个标准还要筛选,-v表示并非筛选出的行

[[email protected] mnt]# grep -i root /mnt/passwd|grep -i -E "^root|root$" -v
test:ROOT:test
test:root:test
test:roottest:test

6)表示只要包涵只有root子段的行,root前后只要有字母都不要,如roottest那行就无须

[[email protected] mnt]# grep -i "<root>" /mnt/passwd|grep -i -E "^root|root$" -v
test:ROOT:test
test:root:test
问题:

翻看全数能登入系统的用户

解答:

[[email protected] mnt]# grep "<bash>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
可知只有root能登入
7)grep -n 表示展现寻觅出的字符串所在行号

[[email protected] mnt]# grep -n hello /mnt/passwd
4:hello

8)gep -n2 表示展现寻觅出的行以及它的上边2行和底下2行,并且出示各自在文书中的行号

注:要是-n和2里头有空格则意味除了上面展现的开始和结果还有可能会在每行开始呈现出文件名

[[email protected] mnt]# grep -n2 hello /mnt/passwd
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:hello
5-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
6-games:x:12:100:games:/usr/games:/sbin/nologin

9)grep -B2 表示展现寻找出的行以及那行的上两行内容
[[email protected] mnt]# grep -B2 hello /mnt/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
10)grep -A2 表示下两行

[[email protected] mnt]# grep -A2 hello /mnt/passwd
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
11)表示寻找/mnt目录下富含root字符的文本
[[email protected] mnt]# grep -r hello /mnt/
/mnt/passwd:hello

5.cut

用法:cut -d 分隔符 -f 第几列 文件

-c内定字符

-d钦赐分隔符

-f钦命第几列

cut -d : -f 2 /mnt/psswd     #以:为分隔符,呈现passwd文件第二列

cut -d : -f 2,7 /mnt/psswd   #,表示第二和第七列,假使是-表示2到第7列

cut -c 3 /mnt/passwd      #展现第三列的字符,不采取分隔符

cut -c 1,3 /mnt/passwd     #展示一和三列的字符,不使用分隔符

题目:

显示eth0网卡的ip

解答:

[[email protected] mnt]# ifconfig eth0|grep "<inet>"|cut -d " " -f 10
172.25.254.1

6.awk

-v表示给变量赋予内容:

[[email protected] mnt]# name=hello
[[email protected] mnt]# awk -F : -v name=$name 'BEGIN {print name} {print $1}END {print "end"}' /mnt/passwd
hello
root
bin
daemon
hello
mail
games
test
test
test
test
end
7.sed

-i      #以此参数表示写入文件

sed ‘s/old/new/g’ passwd       #将passwd文件中的全体old字符替换为new

sed ‘s/old/new/g’ passwd       #将passwd文件中的全部old字符替换为new,并写入passwd文件

sed ‘2,5s/old/new/g’ passwd      #替换2到5行

sed ‘/adm/,/gdm/s/old/new/g’ passwd   #从adm字符从来到gdm字符的内容团长old替换为new

sed -e ‘s/old/new/g’ -e ‘s/old1/new1/g’ passwd   #将old替换为new同时将old1替换为new1

sed 5d passwd    #删除第5行

sed 5p passwd    #复制第5行

sed -n 5p passwd    #只显示第5行

-p    #意味着一向将 sed 的动作写在多少个档案内, -f filename 则能够实行filename 内的sed 动作

vim file

s/sbin/westos/g
s/nologin/linux/g

sed -f file passwd

题目:

将httpd服务端口改为8080

解答:

############################
# Author     :vaon                           #
# Create Date:2017-12-16             #
# Email      :[email protected]       #
############################

#!/bin/bash
PORT=`grep ^Listen /etc/httpd/conf/httpd.conf`
sed "s/$PORT/Listen $1/g" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

8.装置变量

1)一时安装(遇到级)

在如今情状生效,当前条件关闭,变量失效

先看三个例证:

[[email protected] mnt]# a=1
[[email protected] mnt]# echo $a
1
[[email protected] mnt]# vim test.sh
#!/bin/bash
echo $a
[[email protected] mnt]# sh test.sh 

[[email protected] mnt]#

#出于a=1是在现阶段采用的shell里面赋的值,当进入脚本推行时,脚本使用的是子shell,那些子shell中并从未设定a=1,所以结果为空

[[email protected] mnt]# export a=1
[[email protected] mnt]# sh test.sh
1

#能够不常设定a=1给具有shell,一旦登出就能失去那几个一时设定

2)长久设置

【1】.系统级

对富有用户生效

[[email protected] mnt]# vim /etc/profile

export a=1

[[email protected] mnt]# source /etc/profile

[[email protected] mnt]# logout
Connection to 172.25.254.1 closed.
[[email protected] Desktop]# ssh [email protected]
[email protected]'s password:
Last login: Sat Dec 16 09:12:16 2017 from 172.25.254.10
[[email protected] ~]# cd /mnt/
[[email protected] mnt]# sh test.sh
1

#诸如此类具备shell都得以运用a=1这一个变量,登出体系再登入仍旧留存a=1

【2】.用户级

只针对配置过的用户生效,别的用户不恐怕使用

vim /root/.bash_profile

export a=1

source /root/.bash_profile

近些日子a=1只对root用户生效

9.将脚本加到系统命令中去
[[email protected] mnt]# vim /etc/profile

export PATH=$PATH:/mnt

注:这里同样存在系统级或用户级的装置,在此处运用的是系统级设置。若是只同意root能够设置/root/.bash_profile文件

[[email protected] mnt]# source /etc/profile

[[email protected] mnt]# chmod x test.sh 

然后退出/mnt目录,直接把test.sh脚本当成系统命令去实施,开采也可以:

[[email protected] mnt]# cd
[[email protected] ~]# test.sh
1
10.命令别称

1)使用别称

[[email protected] ~]# vim /etc/bashrc
alias kan='cat'             #表示实施'kan'的时候一定于实施'cat'命令

[[email protected] ~]# source /etc/bashrc

查看小名列表:

[[email protected] ~]# alias

         ...

alias kan='cat'

         ...

施行kan这些单词就也就是推行cat命令

[[email protected] ~]# kan /mnt/test.sh
######################################
# Author     :vaon                   #
# Create Date:2017-12-16             #
# Email      :[email protected]         #
######################################
                          
#!/bin/bash
echo $a
2)删除却号
删除/etc/bashrc中的alias kan='cat'

下一场在剔除kan音讯:

unalias kan

当今查看alias列表,里面已经远非kan的音信了

11.*和@区别

vim test.sh

#!/bin/bash
echo '$1 Is' $1
echo '$2 Is' $2
echo '$3 Is' $3
echo '$* Is' $*
echo '$# Is' $#
echo '[email protected] Is' [email protected]
[[email protected] mnt]# sh test.sh 1 2 3
$1 Is 1                                                   #显示第1个字符
$2 Is 2                                                   #显示第1个字符
$3 Is 3                                                   #显示第1个字符
$* Is 1 2 3                                             #来得全数字符
$# Is 3                                                   #展现最终贰个字符
[email protected] Is 1 2 3                                           #展示全数字符
*和@都表示全体剧情,但事实上三个是具有内容方到“”里面。而@是各样数据都加引号

$*   “1 2 3”

&@  “1” “2” “3”

12.shell脚本中等学校函授数的概念

READ()

{

        echo hello word

}

13.变量比照

1)test

2)[ ]

[[email protected] mnt]# a=1
[[email protected] mnt]# b=1
[[email protected] mnt]# test "$a" == "$b" && echo yes || echo no
yes
[[email protected] mnt]# [ "$a" == "$b" ] && echo yes || echo no
yes
3)[ 条件1 -a 条件2 ] 表示原则1和2都满意
4)[ 条件1 -o 条件2 ] 表示原则1和2任二个满足

5)[ 条件1 -eq 条件2 ]  等于

6)[ 条件1 -ne 条件2 ]  不等于

7)[ 条件1 -gt 条件2 ]  大于

8)[ 条件1 -ge 条件2 ]  大于等于

9)[ 条件1 -lt 条件2 ]  小于

10)[ 条件1 -le 条件2 ]  小于等于

[[email protected] mnt]# [ "$a" -eq "$b" ] && echo yes || echo no
yes

11)[ -n ]   变量内容不为空

12)[ -z ]    变量内容为空

[[email protected] mnt]# a=8
[[email protected] mnt]# [ -n "$a" ] && echo yes || echo no
yes
[[email protected] mnt]# [ -z "$a" ] && echo yes || echo no
no

13)[ -b ]  是不是为块设备文件

14)[ -c ]  是还是不是为字符设备文件

[[email protected] mnt]# [ -b /dev/sda ] && echo yes || echo no
yes
[[email protected] mnt]# [ -c /dev/vfio/vfio ] && echo yes || echo no
yes

15)[ -f ]  是还是不是为正规文件

16)[ -S ]  是还是不是为套接字文件

17)[ -L  ]  是不是为链接文件

18)[ -d ]  是或不是为目录

19)[ -e ] 文件是不是留存

20)[ -r ]  是不是可读

21)[ -w ]  是还是不是可写

22)[ -x ]  是不是可实行

18)[ filename1 -nt filename2 ]  如果 filename1 比 filename2 新,则为真

19)[ filename1 -ot filename2 ]  如果 filename1 比 filename2 旧,则为真

[[email protected] mnt]# touch file
[[email protected] mnt]# [ /mnt/check_ip -ot file ] && echo yes || echo no
yes

题目:

彰显输入的文件类型

解答:

#!/bin/bash
[ -e $1 ] && (
        [ -f $1 ] && echo "$1 Is File"
        [ -d $1 ] && echo "$1 Is Directory"
        [ -b $1 ] && echo "$1 Is Block File"
        [ -L $1 ] && echo "$1 Is Link"
        [ -S $1 ] && echo "$1 Is Socket"
)
14.四则运算

15.语句

case语句:
出现的去相配全数规则,全体规则同有难点候去安排,成效比if语句高

if语句是逐行去相配,第一行不匹配再去相配下一行,功能非常低

exit 退出脚本。后边加数字1|0则意味着退出后$?的值为1|0

break 退出循环

练习题四,

是因为上篇作品总结的不是很详细,有多数地点尚未提到到shell各种方面,所以发布此作品对shell做了更周密的总计:

Linux正则表明式sed 详述

sed、awk工具得以兑现公文替换并且把替换的公文输出到显示屏上
sed和awk都是流式编辑器,是针对性文书档案的行来操作的。sed经常用来替换操作。

以身作则的文本内容,以下操作依据此文件。
[[email protected] ~]# cat test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

1、打字与印刷某一行
sed -n 'n'p filename 单引号内的n是四个数字,表示第几行;p也足以写到引号内;

示例,打印passwd第3-5行;

[[email protected] ~]# sed -n '3,5'p /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

打字与印刷全体行

[[email protected] ~]# sed -n '1,$'p /etc/passwd

打字与印刷某一行,并且要来得行号,需求和grep一齐利用;

[[email protected] ~]# grep -n '.*' test.txt | sed -n '1'p
1:rrt

2、打字与印刷带有有个别字符串的行

字符串供给用/ /括起来;grep中的特殊符号^ $ . * 同样适用于sed中。
[[email protected] ~]# sed -n '/root/'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

打字与印刷带有/sbin/nologin的行,/供给张开脱意;
[[email protected] ~]# sed -n '//sbin/nologin/'p passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

打字与印刷以d开首的行;打字与印刷以in结尾的;打字与印刷r与o字母中间有2个随机字符的;打字与印刷带有2个o及多少个o的行;
[[email protected] ~]# sed -n '/^d/'p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# sed -n '/in$/'p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# sed -n '/r..o/'p test.txt
rooooot:x:0:0/roooooot:/bin/bash
[[email protected] ~]# sed -n '/ooo*/'p test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

3、-e能够兑现五个表现
[[email protected] ~]# sed -e '1'p -e '/111/'p -n test.txt 
rot:x:0:0:rot:/rot:/bin/bash
11111111111111111111111111111111

能够用-e写四个;-e也便是传送带,先相配最前边的打字与印刷,再合作前面包车型地铁打字与印刷,所以率先行会打字与印刷2次;

[[email protected] ~]# sed -e '/root/p' -e '/bash/p' -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash

-e前边也能够用;分号;-n不可能写到-e的后边,能够写在-e的前方或最前面;
[[email protected] ~]# sed -e '/root/p;/bash/p' -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash

4、删除某行可能多行

‘d’ 那几个字符正是去除的动作了,不仅可以够去除内定的单行以及多行,而且还能去除相称有些字符的行,别的还可以去除从某一行一直到文书档案末行。

演示,删除第一行;删除1-3行;删除包括root关键词的行;删除第3行到结尾一行全数行;
[[email protected] ~]# sed '1'd test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed '1,3'd test.txt 
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed '/root/'d test.txt
rot:x:0:0:rot:/rot:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed '3,$'d test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash

5、替换字符或沟通字符串

身体力行,替换第一行字母r为PRADO;替换1-2行中ot为to;替换全部行中ot为to;
[[email protected] ~]# sed '1s/r/R/g' test.txt 
RRt
[[email protected]ia ~]# sed '1,2s/ot/to/g' test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[[email protected] ~]# sed 's#ot#to#g' test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooto:x:0:0/roooooto:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

与vim编辑器里面替换一样的通令格式,s代表替换,g代表全局,不加g的话只替换行的率先个;可以使用# @作为分隔符。

1s象征只替换第一行;1,3s代表首先行到第三行;不加行数的话默感到满门行。

身体力行,删除文书档案中具备的数字's/[0-9]//g'  如剔除文书档案中具备的假名's/[a-zA-Z]//g'删除全部的数字和字母's/[0-9a-zA-Z]//g'
[[email protected] ~]# sed 's/[0-9]//g' test.txt 
rot:x:::rot:/rot:/bin/bash
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/sbin:/sbin/nologin
rooooot:x::/roooooot:/bin/bash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

身体力行,删除文书档案中有所的字母
[[email protected] ~]# sed 's/[a-z]//g' 1.txt 
::0:0:/://
::11:0::/://
::11:0::/://
::0:0:/://
1111111111111111111111111111111

示范,删除文书档案中不是英文字母的(数字和特殊符号)
[[email protected] ~]# sed 's/[^a-z]//g' 1.txt 
rotxrotbinbash
operatorxoperatorrootsbinnologin
operatorxoperatorroootsbinnologin
rooootxroooootbinbash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

示范,删除文书档案中不是数字的(英文字母和特殊符号)

[[email protected] ~]# sed 's/[^0-9]//g' 1.txt 
00
110
110
00
1111111111111111111111111111111

示范,把文书档案中的小写字母全部交换为大写字母 's/[a-z]/u&/g'
[[email protected] ~]# sed 's/[a-z]/u&/g' 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH
OPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGIN
OPERATOR:X:11:0:OPERATOR:/ROOOT:/SBIN/NOLOGIN
ROOOOT:X:0:0:/ROOOOOT:/BIN/BASH
1111111111111111111111111111111
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

亲自去做,把文书档案中的大写字母全体调换为小写字母 's/[A-Z]/l&/g'

[[email protected] ~]# sed 's/[A-Z]/l&/g' 1.txt 
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

轮换的还要加-n p 打印特定的行;

[[email protected] ~]# sed -n '1s/[a-z]/u&/g'p 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH

6、沟通三个字符串的职位
sed -r 's/([^:] )(:.*:)([^:] $)/321/'
[^:]非冒号,不是冒号的持有字符
-r, --regexp-extended  在本子中应用扩充正则表明式; 加r选项的意味为前边不用再加脱意 
( )括号括起来是分段的乐趣,
321    是意味3交流1,前边的原委调换来前面

身体力行,aa与ff沟通;加-r选项不用加脱意符号;不加-r ( )括号左右都急需加脱意;调换多行用最终一个;
[[email protected] ~]# cat 1.txt 
aa:bb:cc:dd:ee:ff
[[email protected] ~]# sed -r 's/(aa)(.*)(ff)/321/' 1.txt
ff:bb:cc:dd:ee:aa
[[email protected] ~]# sed 's/(aa)(.*)(ff)/321/' 1.txt 
ff:bb:cc:dd:ee:aa
[[email protected] ~]# sed -r 's/([^:] )(:.*:)([^:] $)/321/' 1.txt 
ff:bb:cc:dd:ee:aa

演示,rot与/bin/bash进行轮换
[[email protected] ~]# grep 'rot' test.txt
rot:x:0:0:rot:/rot:/bin/bash
[[email protected] ~]# grep 'rot' test.txt |sed 's/(rot)(.*)(/bin/bash)/321/'
/bin/bash:x:0:0:rot:/rot:rot
[[email protected] ~]# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/321/'
sed:-e 表达式 #1,字符 18:“s”的茫然选项
[[email protected] ~]# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/321/'
/bin/bash:x:0:0:rot:/rot:rot

加-r  后()内的/bin/bash 也还索要脱意能力够;

-i 选项    直接沟通字符,并且保留原著件里面。使用i选项前,记得备份原来的文章件。

[[email protected] ~]# sed -r -i 's/([^:] )(:.*:)([^:] $)/321/' 1.txt 
[[email protected] ~]# cat 1.txt 
ff:bb:cc:dd:ee:aa

在sed命令中引进shell变量

Linux下Shell编制程序——sed命令基本用法

Unix文本管理工科具之sed 

sed 高等用法

sed命令详解与示范

本文长久更新链接地址:

详述 sed、awk工具得以实现文件替换并且把替换的文本输出到显示器上 sed和awk都以流式编辑器,是指向文书档案的行来操作的。...

本人有啥样说怎么,说实在的,那有个别作者备感是liunx中最乱的地方,也是最倒霉学的,也是能来看人最规范的地点,通晓本身的意味了吗,,,,本肉体会。澳门新萄京官方网站 1

第1章 练习题

 

数组 declare

1.1 每一天早晨 12 点,打包站点目录/var/www/html 备份到/data 目录下(最棒每便备份定时间更换不相同的备份包)

小说版权:

概念变量的品类

1.1.1 测试命令

[[email protected] ~]# cd / && tar zcf /data/www_`date %F`.tar.gz  var/www/html

碰到变量路线:

declare 选项 变量名=值

1.1.2 写入脚本中

[[email protected] /]# cat /server/scripts/www.sh

cd / && tar zcf /data/www_`date %F`.tar.gz  var/www/html

[[email protected] ~]# set   //查看到的是局地变量和全局变量2种

选项有

1.1.3 测试脚本

[[email protected] ~]# sh /server/scripts/www.sh

[[email protected] ~]# env  //查看系统的大局情状变量

-i 整形的变量

1.1.4 写入按时义务

[[email protected] /]# crontab -l |tail -2

#### backup /var/www/html dir

00 00  * * *  /bin/sh  /server/scripts/www.sh >/dev/null 2>&1

[[email protected] ~]# echo $PATH  //查看系统碰着变量路线

-r 只读的变量 定义就不得以修改了

1.1.5 检查实行结果

[[email protected] ~]# ll /data/

total 16

-rw-r--r--  1 root root 154 Sep 11 09:44 www_2017-09-11.tar.gz

[[email protected] ~]# export $PATH  //也足以使用export查看景况变量路线

-x 系统境遇变量

1.2 每一周 六、日 中午 9:00和晚上 14: 00  来老男孩这里学习(实行顺序/server/script/oldboy.sh替代学习)。

00 9,14 * * 0,6  /bin/sh /server/scripts/oldboy.sh >/dev/null 2>&1

                     0表示星期二

                     6表示礼拜二

[[email protected] ~]# export PATH=$PATH:/date/  //一时增添/date目录随地境变量路线下

-a 数组变量 想把多少个变量定义成八个组

1.3 描述下列路径的剧情是做哪些的。

/etc/sysctl.conf            系统基本的布局文件

/etc/rc.local               开机自运行

/etc/hosts                  ip与域名的呼应关系 ,分析主机名

/etc/fstab                  开机自动挂载

/var/log/secure             用户登录信息,首要查看里面包车型客车Failed

要想重启主机后还生效将在编写制定情状布置文件root/.bashec或/root/.bash_profile与/etc/profile文件,想要立即见效能够接纳命令:

---------

1.4 请说出下列 grep 正则表明式的意思

^         以...开首的行

$         以...结尾的行

.(点号)    大肆一个字符

         在转义字符  n t

*           前一个字符演习出现0次或1次以上

{n,m}       前叁个字符一连出现,至少n次,最多m

[^t]         取不包罗t的

^[^t]        以不是t的开头

注:.bash_profile文件支队系统当下用户生效

[[email protected] ~]# declare -i a=1 b=2

1.5  排除文件中的空行和空格

[[email protected] ~]# source .bash_profile  

[[email protected] ~]# declare -i c=$a*$b

1.5.1 文件的内容

[[email protected] ~]# cat -A mun.txt

znix1$

znix2$

znix3$

$

znix4$

      $

znix5$

      $

znix6$

[[email protected] ~]# ls –a    可以查看到这2个公文

[[email protected] ~]# echo $c

1.5.2 egrep方法

搜索空行  -v参数排除

[[email protected] ~]# egrep -n "^ *$" mun.txt

4:

6:     

8:     

10:

14:

[[email protected] ~]# egrep -n  "^$|^ $" mun.txt

4:

6:     

8:     

10:

14:

 

2

1.5.3 awk方法

[[email protected] ~]# awk '!/^[ ]*$/' mun.txt

znix1

znix2

znix3

znix4

znix5

znix6

本子的施行:

---------

1.6 把passwd.txt 第一列抽出来

sh script    //这种方法script无需可进行权限

创建数组

1.6.1 文件内容

[[email protected] ~]# cat passwd.txt

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

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

./ script          //必须具有可举行权限

[[email protected] ~]# declare -a teaname

1.6.2 排除思想

[[email protected] ~]# egrep "^[^:] " passwd.txt  -o

root

bin

……

. script           //这种方法script也无需可施行权限

----------

1.6.3 sed方法

[[email protected] ~]# sed -r 's#(^.*)(:x.*:)(.*)#321#g' passwd.txt

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

/sbin/nologin:x:1:1:bin:/bin:bin

……

扫除不是以 :初阶的行

[[email protected] ~]# sed -r 's#(^[^:] )(.*:)(/.*$)#321#' passwd.txt

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

/sbin/nologin:x:1:1:bin:/bin:bin

……

                       

翻看数组

1.6.4 awk方法

awk中的变量:

-vOFS=":"

OFS 的内容就是 , 的内容

awk在体现每一列内容的时候,每一列之间的相间符

-v 修改和创设awk能够应用的变量

[[email protected] ~]# awk -F: -vOFS=":" '{print $NF,$2,$3,$4,$5,$6,$1}' passwd.txt

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

/sbin/nologin:x:1:1:bin:/bin:bin

……

有别于局地变量和全局变量

[[email protected] ~]# declare -a

1.7 vi/vim命令、快捷键

 含义

命令

退出保存

:wq

退出并强制保存,!为强制的意思

:wq!

强制退出,不保存 

:q!

另存为

:q  /tmp/****

光标移动到文件的最后一行

G

光标移动到文件的第一行

gg

光标移动到文件的100行

100gg 100G :100

从光标所在位置将光标移动到当前行的开头

0  ^

从光标所在位置将光标移动到当前行的结尾

$

删除当前行的内容

dd

删除当前行到文件的最后一行的内容 

dG

删除当前行到文件的第一行的内容

dgg

粘贴

p

粘贴10次

10p

复制

yy

取消上一次的动作

u

删除一行

dd

/ 搜索内容

继续向下搜索              n

继续向上搜索              N

向上搜索 

?

取消对找到的内容的高亮显示

:noh

[[email protected] ~]# str=1000   //局地变量

------

1.7.1 编辑services定位到第100行把这一行复制到文件的末梢一行粘贴十次。

100gg

yy

G

10p

 

数组赋值 增加音讯)

1.8 授权 oldboy 目录及其子目录 755 的权限。

chmod -R 755 oldboy

[[email protected] ~]# echo $str

数组名 [成分下标]=值

1.9 把 oldboy 目录及其子目录的属主改为 oldboy,组改为 root。

chown  oldboy.lodboy oldboy.txt

1000

----------

1.9.1 修改时或然产生的一无可取

[[email protected] ~]# id oldboy

uid=500(oldboy) gid=501(incahome) groups=501(incahome)

[[email protected] ~]# chown oldboy.oldboy oldboy-new.txt

[[email protected] znix ~]# chown oldboy.oldboy num.txt

chown: invalid user: `oldboy.oldboy'

检查oldboy用户是不是存在,检查oldbo那个用户组是或不是存在

去编辑贰个剧本:

给数组增多内容

1.10 描述下 umask 的作用.

umask管理着linux暗许的权能

实例1-1 当umask为021时

file 权限为644

 666-021 001=644

dir 权限为 756

 777-021=756

# vim bianliang.sh

[[email protected] ~]# teaname[0]=yzs

1.11 每一天打包备份 /etc/rc.local /etc/hosts /etc/services 到 /backup目录。

#!/bin/bash

[[email protected] ~]# teaname[1]=xly

1.11.1 测试命令

[email protected] ~]# cd / && tar zcf /backup/file`date %F`.tar.gz  etc/rc.local  etc/hosts etc/services

  [email protected] /]# ll /backup/file2017-09-11.tar.gz

-rw-r--r-- 1 root root 127455 Sep 11 15:41 /backup/file2017-09-11.tar.gz

echo $str

[[email protected] ~]# teaname[2]=lili

1.11.2 写入脚本

[[email protected] /]# cat /server/scripts/file.sh

cd / && tar zcf /backup/file`date %F`.tar.gz  etc/rc.local  etc/hosts etc/services

[[email protected] ~]# bianliang.sh  //大家定义的变量,然而透过脚本却不能出口

[[email protected] ~]# declare -a

1.11.3 测试脚本

[[email protected] /]# sh /server/scripts/file.sh

[[email protected] /]# ll /backup/file2017-09-11.tar.gz

-rw-r--r-- 1 root root 127455 Sep 11 15:44 /backup/file2017-09-11.t

[[email protected] /]# cat /server/scripts/file.sh

 

declare -a BASH_ARGC='()'

1.11.4 写入定期义务

### beifen zhongyaowenjan

00 00 * * * /bin/sh /server/scripts/file.sh >/dev/null 2>&1

[[email protected] ~]# export str   //增添到全局变量中

declare -a BASH_ARGV='()'

1.11.5 测试定期职务

[[email protected] ~]# date -s '23:59:29'

Mon Sep 11 23:59:29 CST 2017

[[email protected] ~]# ll /backup/file2017-09-1*

-rw-r--r-- 1 root root 127455 Sep 11 15:44 /backup/file2017-09-11.tar.gz

-rw-r--r-- 1 root root 127455 Sep 12  2017 /backup/file2017-09-12.tar.gz

[[email protected] ~]# bianliang.sh   //再一次使用完全ok

declare -a BASH_LINENO='()'

第2章 回想课程

1000

declare -a BASH_SOURCE='()'

2.1 定期职责

要想完全的铲除有些全局变量:

declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'

每隔 2 个钟头将/etc/services 文件打包备份到/tmp 下(最佳每一回备份成差别的备份包)

# unset str  清除全局变量

declare -a DIRSTACK='()'

2.1.1 测试命令

[[email protected] ~]# cd / && /bin/tar zcf /tmp/ser_`date %F_%H`.tar.gz  etc/services

#env   能够查阅到全体全局变量

declare -a FUNCNAME='()'

2.1.2 放入脚本中

[[email protected] ~]# cat /server/scripts/ser.sh

cd / && /bin/tar zcf /tmp/ser_`date %F_%H`.tar.gz  etc/services

&& || 的用法:(参数的比对)

declare -a GROUPS='()'

2.1.3 测试脚本

[[email protected] ~]# sh /server/scripts/ser.sh

&& 标准符合供给才会实行前面包车型客车动作

declare -a PIPESTATUS='([0]="0")'

2.1.4 写入按时职责

[[email protected] ~]# crontab -l |tail -2

#backup /etc/services

00 */2 * * * /bin/sh /server/scripts/bak-ser.sh >/dev/null 2>&1

||    条件不符合要求时才会推行前边的动作

declare -a teaname='([0]="yzs" [1]="xly" [2]="lili")'

2.1.5 检查定时职务是或不是成功

1)是还是不是卷入成功,看看文件之中是不是有扩展的新闻

2)查看定期任务日志 /var/log/cron

//查看/ect目录下是或不是有/grub.conf文件,有则输出yes,无则输出no。

------------

2.2 不或然连接linux

[[email protected] ~]# [ -f /etc/grub.conf ] && echo yes  || echo no 

[[email protected] ~]# serip=(1.1.1.1 2.2.2.2 3.3.3.3)

2.2.1 道路是不是通畅

ping ip地址

实例2-1 不能ping通的解决办法:

服务器的ip地址是还是不是科学

服务器网卡是或不是运维,即ONBOOT是还是不是为yes

系统网卡的布局

实例2-2 VMware相关的:

vmware-5个劳务是不是运营

vmware配置-网卡是还是不是连接

翻看你vmware网卡的vmnet8 是还是不是已经起步

Yes        

[[email protected] ~]# declare -a |grep serip

2.2.2 是还是不是有人偏官劫色

翻看 iptables selinux是还是不是关闭

翻开/shellscripts/hello.sh是或不是可进行,可实践则输入yes,不然就予以它可实施权限

declare -a serip='([0]="1.1.1.1" [1]="2.2.2.2" [2]="3.3.3.3")'

2.2.3 是还是不是有人提供劳动

实例2-3 看22端口是或不是展开

方法一: telnet 10.0.0.200 22

方法二: ss -lntup |grep 22

实例2-4 进度是或不是在运维

ps -ef |grep sshd

[[email protected] shellscripts]# [ -x /shellscripts/hello.sh ] && echo yes || chmod x /shellscripts/hello.sh

---------------

2.3 linux无法上网如何是好

[[email protected] shellscripts]# ls

输出数组成分

2.3.1 ping 域名

域名不也许ping 通

[[email protected] ~]# ping centos.houzhaoshun.cn

ping: unknown host centos.houzhaoshun.cn

 

hello.sh  ipadd.sh  logmess_clean.sh 

[[email protected] ~]# echo ${serip[1]}

2.3.2 ping  外网ip

可以ping 通

[[email protected] ~]# ping 123.206.66.149

PING 123.206.66.149 (123.206.66.149) 56(84) bytes of data.

64 bytes from 123.206.66.149: icmp_seq=1 ttl=128 time=63.1 ms

64 bytes from 123.206.66.149: icmp_seq=2 ttl=128 time=60.5 ms

[[email protected] shellscripts]# hello.sh

2.2.2.2

2.3.3 检查dns配置文件

[[email protected] ~]# cat /etc/resolv.conf

hello world!   

出口全体要素

2.3.4 修改配置文件

修改产生重启网卡,生效

[[email protected] ~]# service network restart

Shutting down interface eth0:                              [  OK  ]

Shutting down loopback interface:                          [  OK  ]

Bringing up loopback interface:                            [  OK  ]

Bringing up interface eth0:  Determining if ip address 10.0.0.201 is already in use for device eth0...

                                                           [  OK  ]

“”和‘’与 ` ` 在shell变量中的分裂       

[[email protected] ~]# echo ${serip[@]}

2.4 检查一个软件是还是不是比照 rpm 相关

“ ” 允许通过$符引用其余变量

1.1.1.1 2.2.2.2 3.3.3.3

2.4.1 查询某些软件包是或不是安装

[[email protected] ~]# rpm -qa tree

tree-1.5.3-3.el6.x86_64

‘’禁止引用其余变量符,视为一般字符

[[email protected] ~]# echo ${serip[*]}

2.4.2 查询软件包里面包车型地铁从头到尾的经过

[[email protected] ~]# rpm -ql tree

/usr/bin/tree

/usr/share/doc/tree-1.5.3

/usr/share/doc/tree-1.5.3/LICENSE

/usr/share/doc/tree-1.5.3/README

/usr/share/man/man1/tree.1.gz

`` 将下令实行的结果输出给变量

1.1.1.1 2.2.2.2 3.3.3.3

2.4.3 查询有个别命令属于哪个软件包

查询的时候要运用绝对路径

[[email protected] ~]# rpm -qf `which crond` 

cronie-1.4.4-16.el6_8.2.x86_64

 

第1章 演练题 1.1 每一天早上 12 点,打包站点目录 /var/www/html 备份到 /data 目录下(最佳每便备份定期间转移区别的备份包) 1.1....

[[email protected] ~]# echo "$PWD is lujing"

----------

/root is lujing

总结数组元素的个数

[[email protected] ~]# echo '$PWD is lujing'

[[email protected] ~]# echo ${#serip[*]}

$PWD is lujing

3

[[email protected] ~]# echo $a

--------

1000

总括模个成分值的长短 第三个代表0 第贰个代表1 1.1.1.1 是7位.也算)

[[email protected] ~]# echo $aaaaaaaa  //系统把$aaaaa视为多个变量

[[email protected] ~]# echo ${#serip[0]}

 

7

[[email protected] ~]# echo ${a}aaaaaa   //把变量用{}括起来,系统才会去输出变量

---------

1000aaaaaa

出口模个地方的元素从具备的数组里挑选第2个因素

#echo `ls`  反引号中的命令时可以独自实施的,然后再由echo输出

[[email protected] ~]# echo ${serip[@]:2}

 

3.3.3.3

扩展:” “反斜杠,效用屏蔽字符的出格含义

------

test命令

[[email protected] ~]# hostname=(www.baidu.com www.sina.com www.uplooking.com)

 用途:测试表明式是或不是创立,创设重回值为0,否重返值为别的值。

[[email protected] ~]# echo ${hostname[2]}

 格式:test  条件表明式  [规范表达式]

www.uplooking.com

 

[[email protected] ~]# echo ${hostname[2]:0}

 ≡ 常见的测试项目

www.uplooking.com

      测试文件的景色

[[email protected] ~]# echo ${hostname[2]:4}

      字符的串相比

uplooking.com

      整数值比较

[[email protected] ~]# echo ${hostname[2]:4:9} 从第多少个起首出口 输出肆人

      逻辑测试

uplooking

 

--------

测试文件的情景

把从荧屏输入的一回IP 地址 存放到数组serip里

   格式:[操作符   文件或目录]

把数组色日跑得多个成分值输出到显示器上

  常见的测试操作符

1 #!/bin/bash

-d :测试是或不是为目录【directory】

2 read -p "请输入第贰个IP地址" a[0]

 

3 read -p "请输入第二个IP地址" a[1]

[[email protected] /]# [ -d /var/spool/ ]

4 read -p "请输入第多个IP地址" a[2]

[[email protected] /]# echo $?

5

0

6 echo ${a[@]}

 

用循环的格局给数组赋值

-e:测测试目录或文件是还是不是留存【exist】

1 #!/bin/bash

 

2 read -p "清输入监察和控制主机的台数:" a

[[email protected] /]# [ -e /etc/passwd ]

3 i=0

[[email protected] /]# echo $?

4 while [ $i -lt $a ]

0

5 do

 

6 read -p "清输入第一台主机ip:" serip[$i]

-f:测试是或不是为文件【file】

7 let i

 

8 done

[[email protected] Packages]# [ -f /etc/passwd ]

9

[[email protected] Packages]# echo $?

10

0

11 echo ${serip[@]}

[[email protected] Packages]#

用循环的法子出口数组成分

 

1 #!/bin/bash

-r:测试当前的用户是不是有读取的权力【read】

2 read -p "清输入监察和控制主机的台数:" a

 

3 i=0

[[email protected] /]# [ -r /etc/shadow ]

4 while [ $i -lt $a ]

[[email protected] /]# echo $?

5 do

0

6 read -p "清输入第一台主机ip:" serip[$i]

[[email protected] /]#

7 let i

 

8 done

-w:测试当前的用户是还是不是有写的权能【write】

9 echo "-------------------------------------------"

 

10 for i in `echo ${serip[@]}`

[[email protected] /]# [ -w /etc/shadow ]

11 do

[[email protected] /]# echo $?

12 echo $i

0

13 done

[[email protected] /]#

14 echo "----------------------------------------"

 

15 for ((i=0;i<$a;i ))

-x:测试当前的用户是还是不是可推行和该公文【excute】

16 do

 

17 echo ${serip[$i]}

[[email protected] /]# [ -x /etc/shadow ]

18 done

[[email protected] /]# echo $?

-----------------------------------------------------------------------

1

-----------------------------------------------------------------------

[[email protected] /]# ll /etc/shadow

正则表达式

----------. 1 root root 1086 2月  26 22:38 /etc/shadow

正则 是用符号来叙述有同一属性的数据

 

转意 在普通情形下 是把特殊符号产生平日符号

-L:测试是或不是为标识链接文件【link】

在grep 正则表明式中) 是把普通符号变成特殊符号 直接写是尚未非凡含义的

 

grep [选项]‘正则表明式’ 文件名

 

命令| grep [选项]‘正则表明式’ 文件名

[[email protected] /]# ll /etc/shadow

管理情势

----------. 1 root root 1086 2月  26 22:38 /etc/shadow

逐行管理 把与正则表明式相配的行输出 以行为管理单位

[[email protected] /]# [ -L /etc/shadow ]

-------------------

[[email protected] /]# echo $?

正则符号

1

^ 开头

整数值比较

$ 结尾

 格式:[ 整数1 操作符整数2 ]

^a 以a为开头

常用的操作测试符

^ 以 为发端的

  -eq:等于(Equal)

^# 以#开头的

  -ne:不等于(Not Equal)

$ 结尾

  -gt:大于(Greater Than)

^$ 有起始和最终

  -lt:小于(Lesser Than)

a$ 以a为末段的

  -le:小于或等于(Lessser or Equal)

^ab$ 以a伊始 b为终极的

  -ge:大于或等于(Greater or Equal)

. 相称大肆单个字符放肆一位)

案例

.$ 配置以点最后的行

  借使登陆用户数小于或等于10则输出YES

* 前边的字符出现0此也许无穷次

 

* >=o o个到多少个

[[email protected] 桌面]# who|wc -l

+ >= 1 1 个到多少个

2

? 是0次或1

[[email protected] 桌面]# [ `who|wc -l` -le 10 ] && echo "YES"

***************************************************

YES

用grep 的时候 下边包车型客车那多少个必要求转意

 

^ $ . [] * ? { } < >/ | ( )

变量的加减法运算:

****************************************************

变量的加法运算:

) 保存 相配的方式

[[email protected] ~]# a=1000

ab) 一个总体

[[email protected] ~]# echo $a

^pac*j$ c出现0此只怕无穷次

1000

^pac)*j$ *前边的ac出现0此或许无穷次

[[email protected] ~]# expr $a $a

[ ] 匹配范围内的相当于即兴三个

2000

[afb] 包括 afb里自由一个都同盟

[[email protected] ~]# echo $a $a              //那是第22中学张冠李戴的操作,运算必须使用expr

[a-d]只要在那之中的有私自贰个都卓殊

1000 1000

[a-Z]全数的假名

[[email protected] ~]# expr $a $a                //$a $a 要有空格不然也是一无所能的

.* 表示全部字符

1000 1000

[^a-c] ^在[]表示取反 未有a到c的都同盟

变量的乘法运算:

^[a-c] 以abc开头的

[[email protected] ~]# expr $a * $a              //* 在操作系统中正是特殊字符,遮掩字符的奇特意义

^[^a-c] 不以abc开头的行

expr: syntax error

| 或

[[email protected] ~]# expr $a * $a

(abc|def)* abc出现o到无穷此 大概def出现0次依旧无穷

1000000

w(abc|def)x 表示wabcx 或者是wbefx 都匹配

[[email protected] ~]# expr 2 / 1      //除法

格外交部次官数

2

{ }钦赐后面包车型客车表达式出现的次数

[[email protected] ~]# expr 2 – 1        //减法

goo){1}d =good

1

goo){2}d =gooood 俩个oo 出现2次

[[email protected] ~]# expr 2 % 1                //取余

{2,} >=2

0

{2,4} >=2 and <=4 最小出现2次最大现身4次

职位变量:

< <shc 相称行里以shc为首的单词

0-9           常用的为1-9

>/ a>/ 匹配行里以a为末段的

经过脚本来看些地方变量:

正则选项

[[email protected] shellscripts]# cat a.sh

-v 取反

#!/bin/bash

-i 不分分寸写

echo $1

-n 展现相配文件的行号

echo $2

-c 彰显正则表明式相配的行数

echo $3

-q 不显得输出的新闻

echo $0

破除前边有空格 和#的 只要有效行

[[email protected] shellscripts]# a.sh a b c d e

[[email protected] opt]# grep -v "^$|^#" /etc/httpd/conf/httpd.conf

a

面试的时候肯能冒出的相配

b

匹配出make地址HWADDR

c

[[email protected] opt]# grep "([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}" /etc/sysconfig/network-scripts/ifcfg-eth0

/shellscripts/a.sh           //$0打字与印刷的是脚本笨的名字

HWADDR=54:E6:FC:71:17:45

 

ip地址

[[email protected] shellscripts]# a.sh 1 2

域名 www . baidu . com

3

[[email protected] opt]# grep "[a-z0-9]{1,}.[a-z0-9]{1,}.[a-z]{2,3}" ifcfg-eth0 aaawww.baidu.com

[[email protected] shellscripts]# a.sh 2 3

主机名

5

url 地址 论坛上贴网站的

[[email protected] shellscripts]# cat a.sh

邮箱

#!/bin/bash

---------------------------------------------------

echo `expr $1 $2`             //$1和$2代表了2个义务变量

sed 沟通式的流编辑器

[[email protected] shellscripts]#

打印 删除 替换 复制 剪切 粘贴 导入 导出

 

管理的时候以行为单位 对文本举行逐行管理

预订义变量

用法

$#  : 指令行中地点参数的个数

sed [ 选项] “动作” 文件名字

$*  : 享有职位参数的内容

一声令下 | sed [ 选项] “动作” 文件名字

$?  : 上一条命令实行后重回的动静,当状态为0时代表平时,非0表示试行卓殊或出错。

打印 “p”

$$  : 这段时间所在进度的进度号

会显示两行 一个是原数据 一个是管理完之后的数额

$!  :  后台运维的最终二个进度号

sed "p" /etc/passwd 有两行

$0  :  方今实施的长河/进度名

sed "p;p" /etc/passwd 多次动功用;间隔

本子的正儿八经书写:

sed "p;=" /etc/passwd = 展现行号

#!/bin/bash

root:x:0:0:root:/root:/bin/bash p打字与印刷的开始和结果

#Date : 2014-5-28

1 =显示的剧情

#Author : Create by meng       //脚本的老祖宗

root:x:0:0:root:/root:/bin/bash 原数据

#Mail :~~                                   //邮件地址

bin:x:1:1:bin:/bin:/sbin/nologin

#Func (do):this is useradd user script.            //脚本的成效

2

#V1.1                  //脚本的本子

bin:x:1:1:bin:/bin:/sbin/nologin

echo "hello,world!"            //前面的才是本子的开始和结果

-n 不显得原数据 只展现输出后的结果

 

[[email protected] opt]# sed -n "p" /etc/passwd

作品版权:

打字与印刷模几行

 

[[email protected] opt]# sed -n "2,5p" /etc/passwd

字符串比较

[[email protected] opt]# sed -n "1p;3p;5p" /etc/passwd

 格式 [ 字符串1 = 字符串2 ]

---------------------

      [ 字符串1 != 字符串2 ]

删除 d

      [ -z 字符串 ]

只删除第一行的来得内容

 

[[email protected] opt]# sed "1d" /etc/passwd

常用的测试操作符

[[email protected] opt]# sed "1d;3d" /etc/passwd

  =:字符串内容如出一辙

起始行 结果行

 !=:字符串内容差异,!号表示相反的乐趣

[[email protected] opt]# sed "1,3d" /etc/passwd

  -z:字符内容为空

加 -i 选项 是操作原来的小说件慎用)

#read -p "input your name: "  name

[[email protected] opt]# sed -i "1d" /etc/passwd

root

------------------------------

#echo $name

用正则表明式来删除 必须求用 / / d 格式相配

#[ $name != "root"] && echo "name is erro"

[[email protected] opt]# sed -n "/xly/,/abc/d" /etc/passwd

##read -p "input your name: "  name

从第 2行开端席卷第2行)在往下删去2行

zhangsan

[[email protected] ~]# sed "2, 2d" /etc/passwd

#[ $name != "root"] && echo "name is erro"

从2开始删掉第多个是5的倍数行之间的行

#echo $name

[[email protected] ~]# sed "2,~5d" /etc/passwd

小说版权:

删去偶数行能除2的) 每2行删去第1行

 

[[email protected] ~]# sed "1~2d" /etc/passwd

逻辑测试

--------------------------------

   格式:[表达式1]   操作符  [表达式2]

轮换 s “ s / / /gi“ g全局 i忽略大小写

  常用的测试操作符

[[email protected] ~]# sed -n "s/a/b/gi" /etc/passwd

   -a 或&&:逻辑与,“而且”的意思

轮换四个范围的 1行到3行

  #上下五个表明式都创立是总体育项目检测试结果才为真,否则为假

[[email protected] ~]#澳门新萄京官方网站:Linux正则表达式sed,shell变量总结回顾。 sed -n "1,3s/a/b/gi" /etc/passwd

   (后边真则推行前面)

------

   -o或||:逻辑或,只怕的情致

用正则 修改 用// 圈起来

   #操作符两边至少一个为真时,结果为真,不然结果为假

把具备的数字改成字母

    (前边假则举办前面)

[[email protected] ~]# sed -n "s/[0-9]/b/g" /etc/passwd

   !:逻辑否

把带有有字母都剔除

  #当钦定条件不成立即,重临结果为真

[[email protected] ~]# sed -n "s/[a-z]//g" /etc/passwd

 

修改运营品级到3

     if条件语句   --单分支

[[email protected] ~]# grep initdefault /etc/inittab

当“条件建构“时实行相应的操作

# 0 - halt (Do NOT set initdefault to this)

         if  基准测试命令               if 磁盘已用空间>百分之七十

# 6 - reboot (Do NOT set initdefault to this)

                 then 一声令下体系   ==》      then 报警

id:5:initdefault:

           fi             

[[email protected] ~]# sed "/id/s/[0-6]/3/" /etc/inittab

选择案例:

#

  只要/boot分区的上空应用超越五分四,输出报告警察方音讯

在sed 的正则表明式里

  #!/bin/bash

-r

 RATE=`df |awk'NR==4{print int($5)}'`

在正则表明式里 不用转意符 能够用-r 解决

 if [$RATE -gt 80]

[[email protected] ~]# sed -r "/id/s/[0-6]{2}/3/" /etc/inittab

  then

把/etc/passwd 文件里 没一行的第一个字符删掉

  echo "warning,DISK is full!"

[[email protected] ~]# sed -n "s/.//" /etc/passwd

  if

把/etc/passwd 文件里 每一行的率先个和末段三个字符删掉

 

) 保存所相配的字符 & 替代你寻觅的有所字符

 

每三个情势 是1 2 ...9 各样格局对应前边的第多少个)里的剧情

                 if条件语句--双分段

出未来首先个 是开端第一个是去掉最后三个的持有内容 的八个是终极三个内容

当“条件创立”、“条件不创制”时进行差异的操作

[[email protected] ~]# sed -n -r "s/(.)(.*)(.)/2/" /etc/passwd

 

修改ip最终的地方为254

if 原则测试命令                if 3306端口是还是不是在监听状态

[[email protected] opt]# sed -r "s/(192.168.1.)(.*)/1254/" ip.txt

 then 一声令下系列1         ==》      then mysqld 服务已运营

192.168.1.254

 else 命令体系2                    else 启动mysqld服务

192.168.1.254

fi                   

192.168.1.254

 

192.168.1.254

引用案例:

192.168.1.254

决断vsftp是还是不是在运作。若已运营则输出提示音讯,不然重新开动vsftp服务

192.168.1.254

#!/bin/bash

192.168.1.254

service vsftp status &>/dev/null

把五个文本全部的大写 字母加上个小括号

 if [ $? -eq 0 ]

[[email protected] opt]# sed "s/[A-Z]/(&)/g" /etc/passwd

then

-----------------------

 echo "vsftp service is running"

增添 a 默许的是每一行都增加三个

 else

[[email protected] opt]# sed -r "aGATEWAY=192.168.1.254" ifcfg-eth0

  /etc/init.d/vsftp restart

钦点地点加多

 fi

[[email protected] opt]# sed -r "1aGATEWAY=192.168.1.254" ifcfg-eth0

 

插入 i 插入到上边

借使/boot分区的长空利用超越五分四,输出警报新闻。大家来写个剧本

[[email protected] opt]# sed -r "1iGATEWAY=192.168.1.254" ifcfg-eth0

 

替换 c

#vi a.sh

第一行替换成GATEWAY....

#!/bin/bash

[[email protected] opt]# sed -r "1cGATEWAY=192.168.1.254" ifcfg-eth0

#a.sh

导入 r

NUM=`df | awk 'NR==5{print int($5)}'`

把有a里的情节导入到找出出来1那行的剧情的上边

if

把只要有1的行导入到a.txt里去

[ $NUM -gt 80 ]

怎样内容到导入到这里原作件

then

[[email protected] opt]# sed -r "/1/r a.txt" 1.txt

 echo "Warning,DISK is full!"

导出 w

if

把有a的原委写到 1.txt里去 会覆盖以前的内容

 

把只要有a的导出到1.txt里

awk的附加扩展

[[email protected] opt]# sed -r "/a /w 1.txt" a.txt

 

------------

[[email protected] ~]# cat /etc/passwd | grep bash | awk -F: '{print ($1)}'

命令组

root

[email protected] opt]# sed -n "2=;2p" a.txt

lenovo

[[email protected] opt]# sed -n "2{=;p}" a.txt

[[email protected] ~]# ^C

-e 若是有多个指令要实践的时候 能够扩大个-e 连起来 作成三个下令组

作品版权:

[[email protected] opt]# sed -n -e "2=" -e "2p" a.txt、

 

除开第一行剩下的内容 取反

for循环语句                            for  收件人  in 邮件地址列表

[[email protected] opt]# sed -n "1 ! p" 2.txt

基于变量的不通值,重复试行一组命令操作   ==》                do

-------------------------

for 变量名  in 取值列表                       发邮件    

删出 d

do                                        done

[[email protected] opt]# sed "d" a.txt

指令类别

4n 把方今行 读出下一行 也便是 第4行不读 别的的 都读

done

[[email protected] opt]# sed "4n;d" a.txt

 

-----------------

#!/bin/bash

sed 复制

for TM in a b c d e

有俩个空中 sed的缓存

do

三个是方式空间 里面不存数据

echo $TM

当sed 管理贰个流的时候 他会把她放到 里买 管理的时候拿进来 管理完了拿出来

sleep 1

一个是保持空间

done

暗中认可情形下哪些都不曾 只有三个换行符n

~                                                                                                                                                                 

俩个挑选

再也测试钦命的尺码,只要条件创立则一再实施相应的授命操作

剪贴

 

H 追加导入到保持空间

while 指令或表明式          while 可用内部存款和储蓄器<100mb

h 覆盖导入到保持空间

do             ==》do

[[email protected] opt]# sed "1h;1d;5G" 2.txt

     指令列表      收获可用内部存款和储蓄器数

粘贴

done                    done

G 追加粘贴到情势空间

文章版权:

g 覆盖粘贴到形式空间

 

[[email protected] opt]# sed "1H;5G" 2.txt

多重分支语句

[[email protected] opt]# sed "1,3h;5G" 2.txt

[email protected] ~]# cat a.sh

-------------------------------------

#!/bin/bash

awk 单独的一门语言 也是逐行处理

#a.sh

awk 的格式

case $1 in

awk [选项] “动作” 文件名

start)

命令 | awk [选项] “动作” 文件名

      echo "start...."

awk -F":" '{print FILENAME}'

           ;;

职分变量 第一列的值正是$1

stop)

$1 。。。$n 分割

      echo "stop......"

$0 代表任何行的新闻

      ;;

职位变量

restart)

[[email protected] opt]# awk -F":" '{print $1,$2}' /etc/passwd

      echo "restart........"

[[email protected] opt]# head /etc/passwd | awk -F":" '{print $1,$2}'

      ;;

打字与印刷当前文件名 FILENAME

laod)

[[email protected] opt]# awk -F":" '{print FILENAME}' /etc/passwd

     echo "laod......."

打字与印刷分割类的个数 NF

      ;;

[[email protected] opt]# awk -F":" '{print NF}' /etc/passwd

status)

时下管理行的行数 N福睿斯

      echo "start....."

[[email protected] opt]# awk -F":" '{print NR}' /etc/passwd

      echo "stop......"

管理当下行在文书内的行数FN福特Explorer

      ;;

[[email protected] opt]# awk -F":" '{print FNR}' /etc/passwd

esac

AWK的暗中同意分隔符 为空格 和 tab键私下认可时能够省略 -F

 

[[email protected] opt]# head -3 /etc/passwd | awk -F":" '{print $1,$3,$4}'

[[email protected] ~]# ./a.sh start

root 0 0

start....

bin 1 1

[[email protected] ~]# ./a.sh stop

daemon 2 2

stop......

-------------

[[email protected] ~]#

awk 管理数据的时候顺序是多少个 行前 行中行后

[[email protected] ~]# cat a.sh

行前

#!/bin/bash

BEGIN{}

#a.sh

[[email protected] opt]# awk -F":" 'BEGIN{print NR}' /etc/passwd

read -p "input:" NUM

0

case "$NUM" in

行中

[a-z]|[A-Z])

{}

      echo "it is english"

[[email protected] opt]# awk -F":" '{print NR}' /etc/passwd

      ;;

行后的

[0-9])

END{}

      echo "it is shuzi"

[[email protected] opt]# awk -F":" 'END{print NR}' /etc/passwd

      ;;

73

*)

-------------------

      echo "........."

用正则

      ;;

awk '条件{print NR}'

esac

~ 匹配

[[email protected] ~]#

!~ 不匹配

 

匹配是root的

[[email protected] ~]# ./a.sh

[[email protected] opt]# awk -F ":" '$1~/root/{print $1}' /etc/passwd

input:2

root

it is shuzi

正如符号

[[email protected] ~]# ./a.sh

= == != > >= < <=

input:a

逻辑比较 || &&

it is english

运算符号

[[email protected] ~]# ./a.sh @

+ - * / % += -= *= /=

input:@

i=5

.........

i =2

[[email protected] ~]# ./a.sh

i=i+2

input:#

i=7

.........

---------------------

[[email protected] ~]#

awk流程调节

 

流程序调整制

      shift迁移语句

分层协会

用于迁移地方变量,将$1~$9依次向左传递

if (条件) 动作

 

若有几个动作,则要用大括号将动作体包括起来

[[email protected] ~]# ./a.sh 10 20

if (条件) {动作 1;动作 2}

The sum is: 30

# awk -F : '{if ($1 == "root") print $1}' /etc/passwd

[[email protected] ~]# cat a.sh

# awk -F: '{if ($1 == "root") {print $1;print $6} }' /etc/passwd

#!/bin/bash

if (条件 1)

#a.sh

动作 1

Result=0

else

while [ $# -gt 0 ]

动作 2

      do

# awk -F: '{if ($1 == "root"){print $1}else print $6}' /etc/passwd

Result=`expr $Result $1`

# awk -F: '{if ($1 == "root") print $1;else print $6}' /etc/passwd

      shift

地点多个指令是等价的 ,要么用分号隔断,表示第三个动作体的达成 ,要么将动作体用大括号定位范围

      done

if (条件 1)

      echo "The sum is: $Result"

动作 1

[[email protected] ~]#

else if(条件 2)

 

动作 2

 

else if(条件 3)

break语句

动作 3

 

else

用来跳出当前的循环体,实行循环体后的说话。

动作 4

 

# awk -F: '{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print

函数的行使

NR}' /etc/passwd

 

条件 ? 动作 1 : 动作 2

[[email protected] ~]# ./c.sh

Expr ? action1 : action2

46

# awk -F: '{print ($3<5?$1:$3)}' /etc/passwd

55

读前管理和读后管理

[[email protected] ~]# cat c.sh

# awk -F: 'BEGIN {print NR,NF}' /etc/passwd

#!/bin/bash

00

#c.sh

# awk -F: 'END {print NR,NF}' /etc/passwd

adder(){

46 7

echo `expr $1 $2`

# awk -F: 'BEGIN{i=1} {i } END {print i}' /etc/passwd

}

47

 

演练 找寻普通用户的用户名并总计数据

adder 12 34

#awk -F: 'BEGIN{i=0} $3>=500 {print $1;i } END {print i}' /etc/passwd

adder 22 33

循环语句

[[email protected] ~]# ./c.sh

while(条件) {

46

动作

55

原则运算

[[email protected] ~]#

}

 

# awk -F: '{while($3<3) {print $3,$1;$3 }}' /etc/passwd

 

BEGIN

宣示:以上文化全来自与自学shell编制程序总计回想

BEGIN 块能够单独运用,不要求引进文件

 

# awk 'BEGIN{i=1;while(i<100) {print i;i }}'

小说版权: ...

勤学苦练 打字与印刷 100 以内的偶数

# awk 'BEGIN{i=1;while(i<100) {if (i%2==0) print i;i }}'

x=1

do {

动作 1

x

} while (x<5)

# awk 'BEGIN{i=5;do{print i;i }while(i<10)}'

# awk 'BEGIN{i=5;do{print i;i }while(i<1)}'

for(预置;条件;递增) {

动作

}

# awk 'BEGIN {for (x=1;x<=4;x ) print x }'

输出样式

# awk -F: '{printf "%-10s %-10d %sn",$1,$3,$7}' /etc/passwd

%s 字符类型, %d 数值类型

printf 暗许是不出口换行的所以要加n

10 和 7 是偏移量

暗中认可是右对齐,全部加个- 就是左对齐,正是把不足的位数用空格填充

留神:格式与输出列之间要有逗号

跳转语句

break 跳出循环

# awk 'BEGIN {for(x=1;x<5;x ) {if (x==3) break;print x }}'

1

2

continue 在直达循环尾部从前终止当前循环 从新起来下一回巡回

# awk 'BEGIN {for(x=1;x<5;x ) {if (x==3) continue;print x }}'

1

2

4

next 读入下一行 同有的时候候重回脚本顶部那样能够制止对当下行施行其余操作

# awk -F: 'NR > 5 {next} {print $1} END {print NR}' /etc/passwd

root

bin

daemon

adm

lp

46

46

#

exit 使读取动作终止 并将调整移动到 END,假设未有 END 则结束脚本

# awk -F: 'NR > 5 {exit} {print $1} END {print NR}' /etc/passwd

root

bin

daemon

adm

lp

6

[[email protected] pub]# cat -b u.txt

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

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 news:x:9:13:news:/etc/news:

[[email protected] pub]# awk -F: 'BEGIN{i=1}NR>5 {next}{print i }END{print NR}' u.txt

1

2

3

4

5

10

[[email protected] pub]# awk -F: 'BEGIN{i=1}NR>5 {exit}{print i }END{print NR}' u.txt

1

2

3

4

5

6

[[email protected] pub]#

数组

自定义数组

# awk 'BEGIN {ary[1]="seker";ary[2]="zorro";print ary[1],ary[2]}'

seker zorro

# awk 'BEGIN {ary[1]="seker";ary[2]="zorro";for(i in ary) print ary[i]}'

seker

zorro

#

巡回发生数组和收取数组

# awk 'BEGIN{n=5;for (i=1;i<=n;i ) ary[i]=i 100;for(m in ary) print m,ary[m]}'

4 104

5 105

1 101

2 102

3 103

#

# awk -F: '{ary[NR]=$1} END {for(i in ary) print i,ary[i]}' /etc/passwd

1 root

2 bin

3 daemon

4 adm

5 lp

6 sync

7 shutdown

8 halt

9 mail

# awk -F: '{ary[$3]=$1} END {for(i in ary) print i,ary[i]}' /etc/passwd

10 uucp

11 operator

12

12 games

13 gopher

14 ftp

32 rpc

37 rpm

正文出自 “history_xcy” 博客,请务必保留此出处

...

本文由澳门新萄京官方网站发布于服务器运维,转载请注明出处:澳门新萄京官方网站:Linux正则表达式sed,shell变

关键词: