SHELL学习基本篇-----文本处理(一)

1 SHELL脚本常用命令

1.1 diff命令:

diff分析两个文件,并输出两个文件的不同的行。diff的输出结果表明需要对一个文件做怎样的操作之后才能与第二个文件相匹配【或者这么理解:与第一个文件相比,第二个文件发生了那些变化】

*)如何使用diff命令?
diff [options] target1 target2
diff file1 file2
diff directory1 directory2
*)diff在比较文件过程中结果读取方式:
[num1,nmu2][a | c | d][num3,num4]
num1.num2表示在第一个文件中的行数
a  表示添加  --add
c  表示更改  --change 
d  表示删除  --delete
<表示第一个文件中的内容,>表示第二个文件中的内容,---分割线
num3,nmu4表示在第二个文件中的行数

2,4c2,4 表示改变第一个文件中的第二行和第四行才能匹配第二个文件中的第二行和第四行

*)diff在比较目录过程中结果的读取
only in directory/:filename
directory 表示在哪个目录中
filename 表示在这个文件
*)diff中常用的参数
-b 或 --ignore-space-change  不检查空格字符的不同
-B 或 --ignore-blank-lines  不检查空白行
-c  显示全部内容,并标出不同之处
-i 或 --igonre-case  不检查大小写的不同
-p  若比较的文件为c语言的程序码文件时,显示差异所在的函数名称
-q 或 --brief  仅显示有无差异,不显示详细的信息
-r 或 --recursive:  比较子目录中的文件   diff -r /mnt /opt
-u 以合并的方式来显示文件内容的不同
-C 1 显示不一样的行的邻近一行
-p 没有上面的参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
1.2 patch命令:

patch
用于文件不同文件打补丁
patch [options] file.old file.path

生成补丁文件 diff -u hello.c hello_diff.c > hello.path
cat hello.path
yum install patch -y
patch hello.c hello.path  用补丁文件对test.c进行修改
vim hello.c   

在这里插入图片描述
在这里插入图片描述
1.3 cut命令:

*)cut 
  cut命令多用于字符截取
  cut -d    指定分隔符
  cut -f 1,7|1-7   指定截取的列
  cut -c 1,4|1-4   指定截取的字符位置

例:cut -d : -f 1 passwd  
    cut -d : -f 1-3 passwd   1-3列
    cut -c 2-4 passwd  截取2到4字符   
    cut -c2,4 passwd  截取第二个和第四个字符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.4 sort命令:

*)sort
  多用于字符排序
  sort  -n    纯数字排序
  sort  -r    倒序
  sort  -u    去掉重复数字
  sort  -o    输出到指定文件
  sort  -t    指定分隔符
  sort  -k    指定要排序的列 (默认排第一列)

例:sort -nr test 
   sort -nru test
   sort -nru test -o westos
   cat westos
假如有两列,以冒号隔开,sort -n test  默认排第一列
   要是想排第二列的话: sort -t : -k 2 -n test

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.5 uniq命令:

*)uniq
  对重复字符做相应的处理
  uniq -u  显示唯一的行
        -d   显示重复的行
        -c   每行显示一次并统计重复次数
   
   sort  test 
   sort  -n test 
   sort  -nu test 
   sort  -n test  | uniq -c  显示结果中前面一行是出现的次数 后面一行是数字内容
   sort  -n test  | uniq -d  出现次数大于1次的
   sort  -n test  | uniq -u  仅出现一次的
         
 怎么找出last -i 输出结果中登陆次数最多的ip地址
last -i | grep 0.0.0.0 -v | grep wtmp -v | cut -d " " -f 14 | uniq -c | sort -nr -t " " -k 5 | head -n 1
或者
last -i | grep 0.0.0.0 -v | grep wtmp -v | cut -d " " -f 14 | uniq -c | sort -nr  | head -n 1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.6 && 和 ||命令:

*)&& 和 ||
&&用来执行条件成立后执行的命令
||用来执行条件不成立后执行的命令
例如:
   ping -c1 -w1 172.25.254.72 &> /dev/null && echo up || echo down

编写脚本实现自动返回能否ping通的结果
   #!/bin/bash
   ping -c1 -w1 $1 &> /dev/null && echo $1 is up || echo $1 is down
或者可以加颜色:
    #!/bin/bash
   ping -c1 -w1 $1 &> /dev/null && {
            echo -e "\033[32m$1 is up\033[0m"
          } || {
            echo -e "\033[31m$1 is down\033[0m"
          }

加上判断输入是否为空的条件
       #!/bin/bash
【 -z "$1"】&& {
          echo "error:please input ipadderss"
          exit
}
   ping -c1 -w1 $1 &> /dev/null && echo $1 is up || echo $1 is down

在这里插入图片描述
在这里插入图片描述
1.7 test命令:

test命令一:
    test命令和[ ]等同
    test "$A" == "$B" 等同 ["$A" == "$B"]
    ["$A" = "$B"]      A与B相等
    ["$A" != "$B"]     A与B不相等
    [ ! "$A" = "$B" ]  条件成立的相反
    ["$A" -eq "$B"]    相等
    ["$A" -ne "$B"]    不等
    ["$A" -le "$B"]    小与等与
    ["$A" -lt "$B"]    小于
    ["$A" -ge "$B"]    大于等于
    ["$A" -gt "$B"]    大于
    ["$A" -ne "$B" -a  "$A" -gt "$B"]  两个条件都要满足
    ["$A" -ne "$B" -o  "$A" -gt "$B"]   满足其中一个条件即可
    [-z "$A"]  表示a的值是不是为空
    [-n "$A"]  不为空
    ["file1" -ef "file2"]  是否互为硬链接
    ["file1" -nt "file2"]  前面的文件是否新于后面的文件
    ["file1" -ot "file2"]  前面的文件是否旧于后面的文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#######设置当根目录的使用率超过80%就提示,每分钟一次########
第一种:#!/bin/bash
  ["`df -h / | tail -n 1 | cut -d " " -f 15 | cut -d "%" -f 1`" -ge "30" ]&& {
          echo "warning: / is full!!" >> /var/log/messages
}
at now+1min <<-EOF
/mnt/checkstorage.sh
EOF

第二种:a=(`df -h / | tail -n 1`)
      echo ${a[4]} | cut -d "%" -f 1

第三种:df -h \ | tail -n1 | awk '{print $5}'

在这里插入图片描述

*)test命令二:
[-e "file"]      -e 文件是否存在
[-f "file"]       -f 是否普通文件
[-l "file"]     -l 是否软链接
[-es "file"]      -s 是否套接字
[-b "file"]       -b 块设备
[-d "file"]      -d 是否目录
[-c "file"]      -c 字符设备

现在先介绍一下软链接与硬链接
 我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
 硬链接:为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名
 由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能交叉文件系统进行硬链接的创建;
不能对目录进行创建,只可对文件创建;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。

软链接:软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。
在这里插入图片描述
软链接的创建与使用没有类似硬链接的诸多限制:

软链接有自己的文件属性及权限等;
可对不存在的文件或目录创建软链接;
软链接可交叉文件系统;
软链接可对文件或目录创建;
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
软硬链接的创建:
cd /mnt 
ln /mnt/ping.sh /mnt/westos  创建硬连接
ls -i  可以看节点号
ls -l 
ln -s /mnt/ping.sh /mnt/westos1   创建软连接
ls -l 
rm -fr /mnt/ping.sh   
ls -l
cat /mnt/westos1
rm -fr westos1   删除了节点号

在这里插入图片描述
在这里插入图片描述

*如何判断一个文件的类型
#!/bin/bash
【 -z "$1"】&& {
          echo "error:please input a file following scripts"
          exit
}
[-e "$1"] || {
        echo "$1 is on exist"
        exit
}
[-L "$1"] || {
        echo "$1 is link file"
        exit
}
..........

1.8 tr命令:

*)tr命令
#!/bin/bash
echo $1 | tr 'a-z' 'A-Z'     #将a-z 转化成A-Z

在这里插入图片描述

2 SHELL脚本文本处理命令(一)

2.1 grep

grep :global search regular expression and print out the line
全面搜索研究正则表达式并显示出来
grep命令是一种强大的文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查打印匹配到的行
由正则表达式或者字符及基本文本字符所编写的过滤条件,为贪婪匹配,只要存在字符串都会显示出来
grep正则表达式与扩展正则表达式:
正规的grep不支持扩展的正则表达式,竖线是用于表示“或”的扩展正则表达式元字符,正规的grep
无法识别,加上反斜杠,这个字符就被翻译成扩展正则表达式,就像egrep和grep -E 一样

grep的格式:
grep  匹配条件 处理文件

grep root passwd   
grep ^root passwd  以root开头的行
grep "root|bash" passwd  不行
egrep "root | bash" passwd = grep -E "root | bash" passwd  搜索root或者bash的行
grep -E "^root | bash$" passwd
grep root$ passwd 以root结尾的行
grep -i root passwd  忽略大小写
grep -i root passwd -v 反向匹配
cat -b passwd | grep games -2 匹配行以及上下两行
cat -b passwd | grep games -A2 匹配行以及下两行
cat -b passwd | grep games -B2 匹配行以及上两行

显示可以登陆系统的用户的名称:
#!/bin/bash
grep -E "sh$" /etc/passwd | cut -d : -f 1

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

*)grep中的正则表达式
^westos
westos$
'w....s'
'w....'
'....s'

grep w...s test
grep w....s test

在这里插入图片描述

*)grep中字符的匹配次数设定
  *  字符出现【0-任意次】
 \?  0-1次
  \+  字符出现1-任意次
  \{n\}  字符出现n次
  |{m,n\} 最少出现m次,最多出现n次
\{0,n\} 0-n次
\{m,\} 至少m次
\(xy\)\{n\}xy  关键字出现n次
.*   关键字之间匹配任意字符


grep xy test
grep x*y  test
grep -E 'x?y' test
grep -E 'x+y' test 
grep -E 'x{2}y' test  
grep -E 'x{2,3}y' test 
grep -E 'x{2,}y' test 
grep -E 'x{,2}y' test 
grep -E '(xy){2,}' test
grep -E 'x.*y' test

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

grep中字符的匹配位置设定
^关键字
关键字$
\<关键字
关键字\>
\<关键字\>
grep -E "\<root" /etc/passwd  以root开头的行
grep -E "\<root\>" passwd  匹配行以root开始

例:摘出eth0网卡中ipv4的ip地址
ifconfig eth0 | grep -E "\<inet\>" | cut -d " " -f 10 

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
2.2 sed:行编辑器
sed(stream editor):用来操作纯 ASCII 码的文本
Sed 一次处理一行内容 处理时,把当前处理的行存储在临时缓冲区中,称之为“模式空间”(pattern space)
可以指定仅仅处理哪些行,Sed 符合模式条件的处理,不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行,这样不断重复,直到文件末尾

sed命令格式
调用sed命令有两种形式:
    sed [options] 'command' file(s)
      
    sed [options] -f 'command' file(s)
sed对字符的处理
p     显示,将某个选择的数据打印显示。通常 p 会与参数 sed -n 一起执行
d     删除,显示模式空间删除指定行后的内容,不会对原文件数据删除
a     添加,a 的后面可以接字符串,该字符串会在当前指定行的下一行出现
c     更改, c 的后面可以接字符串,该字符串可以取代 n1,n2 之间的行
i     插入, i 的后面可以接字符串,该字符串会在当前指定行的上一行出现

2.2.1 p操作模式

sed -n '/\:/p' fstab
sed -n '/UUID$/p' fstab
sed -n '/^UUID/p' fstab
sed -n '/2,6p' fstab
sed -n '/2,6!p' fstab

cat fstab -n | sed 5p
cat fstab -n | sed -n 5p
cat fstab -n | sed -n 3,5p  3到5行
cat fstab -n | sed -n '3p;5p' 3行或5行
sed -n '/#/p' fstab
sed -n '/#/!p' fstab
sed -n '/^$/!p' fstab

例:使用一个内含用户名的文件,执行脚本后可以从文件的第一行执行到最后一行,建立所有的用户。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
2.2.2 d操作模式

d模式操作
sed '/^UUID/d' /etc/fstab
sed '/^#/d' /etc/fstab
sed '/^$/d' /etc/fstab
sed '1,4d' /etc/fstab
sed -n '/^UUID/!d' /etc/fstab

cat -n fstab | sed '3d'						##删除第三行内容
cat -n fstab | sed '3,5d'					##删除3到5行的内容
cat -n fstab | sed '3d;5d'					##删除第三和第五行内容	

在这里插入图片描述
在这里插入图片描述
2.2.3 a操作模式

a模式操作:
sed '/^UUID/ahello westos'  /etc/fstab
sed '/^UUID/ahello\nwestos' /etc/fstab

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2.4 i操作模式

i模式操作

sed '4ihello\nwestos' fstab  			##在第四行插入两行内容hello,westos
sed '/#/c**' -i fstab					##将模式空间修改的内容保存到原文件中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2.5 c操作模式

c模式操作
sed '/^#/chello westos' /etc/fstab			

在这里插入图片描述

将httpd端口改成命令行输入的端口
#!/bin/bash
[ -z "$1" ] && {
	echo "echo:please input number following script"
	exit
	}
	sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
	systemctl restart httpd

2.2.6 w操作模式

w模式操作
sed -n '/^UUID/w file' fstab			##把UUID开头的行内容保存到file文件中
sed '$=' fstab							##统计文件的行数,并在最后一行的上一行显示总行数
sed  -n '$=' fstab						##只显统计文件的行数
sed '7r /mnt/file' fstab				##把file文件的内容插入到fstab第7行的下面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2.7 其他用法

sed的其他用法

sed -n '/^UUID/p' fstab							##只显示UUID开头的那一行
sed -n -e '/^UUID/p' -e '/^#/p' fstab			##显示UUID开头和#开头的行,-e可以在同意行执行多条命令
sed -n -f rule fstab							##-f调用命令文件来直接操作文件
sed 's/sbin/westos/g' passwd					##把文件中所有行所有列的sbin换成westos
sed '1,5s/sbin/westos/g' passwd 				##把文件中1到5行的sbin替换成westos

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sed的其他用法
sed '/lp/,/halt/s/sbin/westos/g' passwd			##替换lp行到halt行的sbin
sed 's/\///g' passwd						    ##将/转换成空,即删掉/,加\是因为/有特殊的含义,需要转义
sed 's@sbin@westos@g' passwd					##把文件中的所有sbin转换成westos,在这里@字符与/的含义相同

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sed的其他用法

sed 'G' fstab 						##给每一行后面都加一个空行
sed '=' fstab						##给每一行的上面都加一个行号
sed '=' fstab | sed 'N;s/\n/ /g'	##让行号显示在每行的前面,取消换行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
############################The End#############################

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值