shell脚本之cut,sort,uniq,tr工具用法,Here Document和Expect用法

shell脚本之cut,sort,uniq,tr工具用法,Here Document和Expect用法

一.cut:列截取工具

选项:
-b:按字节截取
-c:按字符截取,常用于中文
-d:指定以什么为分隔符截取,默认为制表符
-f:通常和-d一起
应用场合:cut只擅长于处理单个字符为间隔的文本

cat /etc/passwd | cut -d':' -f1        文件以冒号分隔截取第一列内容
cat /etc/passwd  | cut -d':' -f3       文件以冒号分隔截取第三列内容
cat /etc/passwd | cut -d':' -f1,3      文件以冒号分隔截取第一列和第三列内容
cat /etc/passwd | cut -d':' -f1-3      文件以冒号分隔截取第一列到第三列内容
who | cut -b3                          截取第三个字符
who | cut -c3                          截取第三个字符
[root@localhost opt]# cat name  | cut -c2  //截取第二个字符可用于汉字

二.sort 工具

是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样

语法:
sort [选项] 参数

选项:
●-f:忽略大小写
●-b:忽略每行前面的空格
●-M:按照月份进行排序
●-n:按照数字进行排序
●-r:反向排序
●-u:等同于uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
●-t:指定分隔符,默认使用[Tab]键分隔
●-o<输出文件>:将排序后的结果转存至指定文件
●-k:指定排序区域

默认ASCLL 码排序,-k1,-k2,-k3表示,第一列,第二列,……

cat /etc/passwd | sort                   //不加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示
cat /etc/passwd | sort -n -t: -k3       以冒号分隔,第3行区域按升序排列
cat /etc/passwd  | sort  -nr -t: -k3    以冒号分隔,第3行区域按降序排列
cat a |  sort  -n -t:  -k3 -o a.bak     将排序的文件输出到文件
sort -u  name.test                      //去掉文件中重复的行(重复的行可以是不连续的)
cat name.test | sort |uniq              先sort排序一下再去重

三.uniq工具

主要用于去除连续的重复行
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重

(1)语法
uniq [选项] 参数
(2)常用选项
-c:对重复的行进行计数;
-d:仅显示重复行;
-u:仅显示出现一次的行

cat a  | uniq -c      //统计重复行的次数,不连续的重复行他不算做重复行
cat a | sort | uniq -c    按字母顺序排列并显示重复行
 cat  a  | sort |uniq -d   //结合sort使用,过滤出重复行
 cat  a  | sort |uniq -u  //结合sort使用,过滤出不重复的行
cat a | sort | uniq      //结合sort使用,去重
cat  a | sort -u         //结合sort使用,去重 

实例1:查看登陆用户

who | awk '{print $1}' | uniq 

实例2:查看登陆过系统的用户

last | awk '{print $1}' | sort | uniq | grep -v "^$" | grep -v wtmp

tr:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符

四.tr工具

语法
用法:tr [选项]… SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

常用选项
-d 删除字符
-s 删除所有重复出现的字符,只保留第一个

cat fruit | tr 'a-z' 'A-Z'   把文件中小写字母全部替换成大写字母
cat  a | tr 'apple' 'APPLE' /替换是一一对应的字母的替换
cat  a  | tr 'a' '   //把替换的字符用单引号引起来,包括特殊字符
cat fruit | tr 'a' '/'      
cat fruit | tr 'ap' '/'  //多个字符替换成一个
 cat fruit | tr 'apple' 'star'    //a替换成s,p替换成a,le替换成r
 cat fruit | tr "'" '/'     //如果想替换单引号则需要用双引号把单引号引起来
cat fruit | tr -d 'a'    //删除所有a
cat fruit | tr -d 'apple'    //把所有含有这5个字母的都删除
cat  a  | tr  -d '\n'    删除回车,把文本显示为一行
cat fruit | tr -s 'p'    //对p字符去重,只保留第一个
cat fruit | tr -s '\n'   //遇到多个回车只保留一个回车,相当于去除空行

五.Here Document概述

使用I/O重定向的方式将命令列表提供给交互式程序标准输入的一种替代品

语法格式

命令<<标记
...
标记
[root@localhost ~]# cat <<EOF
> hello
> word 
> EOF
hello
word 
[root@localhost ~]# 
[root@localhost ~]# cat <<xxx  //自定义标识符
> hello
> xxx
hello
[root@localhost ~]# 

编辑本地yum源配合文件
在这里插入图片描述
如果一个文件需要增加内容时可用>>追加
在这里插入图片描述
在脚本中写入

#!/bin/bash
cat > yum.repo <<EOF
[test]
name=test
baseurl=file:///mnt
gpgcheck=0
EOF

在这里插入图片描述
前面加-,屏蔽制表符,直接输出内容

# ! /bin/bashcat <<EOF
cat <<-EOF
			hello world
EOF

磁盘分区免交互

#!/bin/bash
fdisk /dev/sdb <<EOF
n
p



w
EOF

自定义变量

[root@localhost ~]# read a  <<EOF
> 220
> EOF
[root@localhost ~]# echo $a
220

Here Document使用注意事项
■标记可以使用任意合法字符
结尾的标记一定要顶格写,前面不能有任何字符
结尾的标记后面也不能有任何字符(包括空格)
开头标记前后的空格会被省略掉

六.Expect

●建立在tcl之上的一个 工具
●用于进行自动化控制和测试
●解决shell脚本中交互相关的问题

安装 expext tcl

yum -y  install  expect 
yum -y  install   tcl

expect基本命令
expect
●判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
●只能捕捉由spawn启动的进程的输出
●用于接收命令执行后的输出,然后和期望的字符串匹配send
●向进程发送字符串,用于模拟用户的输入
●该命令不能自动回车换行,一般要加\r (回车)

spawn
启动进程,并跟踪后续交互信息结束符

expect eof
等待执行结束
执行自动化任务通常使用expect eof

interact
执行完成后保持交互状态,把控制权交给控制台

set
●设置超时时间,过期则继续执行后续指令
●单位是秒
●timeout-1表示永不超时
●默认情况下,timeout是10秒
exp_continue
●允许expect继续向下执行指令
send_user
●回显命令,相当于echo

接收参数
●Expect脚本可以接受从bash传递的参数
●可以使用[lindex $argv n]获得
n从0开始,分别表示第一个,第二个.第三个…参数

免交互式ssh远程

#!/usr/bin/expect 

spawn ssh root@192.168.80.1

expect {
        "(yes/no)"
        { sed "yes\r"; }
        "password:"
        { send "123456\r"; }
}

interact

免交互式ssh远程,执行命令后退出

        "(yes/no)"
        { sed "yes\r"; }
        "password:"
        { send "123456\r"; }
}
expect "#"
send "ls /\r"
send "ifconfig ens33\r"
send "exit\r"
expect  xxx     //xxx为结束符                                         

引用位置变量

#!/usr/bin/expect 
set timeout 10  //设置超时时间,登陆超时多少秒退出
log_file test.log  //开启日志文件,日志记录操作
log_user 1        //1为屏幕输出信息,0为不输出
set user  root
set ip [lindex $argv 0]  //设置第一个位置变量为ip
set  pass [lindex  $argv 1] //设置第二个位置变量为登陆密码

spawn ssh $user@$ip

expect {
        "(yes/no)"
        { sed "yes\r"; }
        "password:"
        { send "$pass\r"; }
}
expect "#"
send "ls /\r"
send "ifconfig ens33\r"
send "exit\r"
expect  xxx

在这里插入图片描述
在shell脚本中的免交互ssh登陆

#!/bin/bash 

expect -c "       //需要用expect -c调用expect程序
spawn ssh root@192.168.80.1
expect \"password:\" { send \"123456\r\" }
interact
"

shell脚本免交互式ssh远程,执行命令后退出

#!/bin/bash 

expect -c "
spawn ssh root@192.168.80.1
expect \"password:\" { send \"123456\r;exp_continue\" }
expect \"]#\" { send \"ifconfig ens33\r\" }
expect \"]#\" { send \"exit\r\" }
expect  eof
"

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值