seq命令,tr命令,sort命令,cut命令

seq命令

用途:打印出一串有序的数字
格式:seq [选项] 数字范围

  • -s:指定分隔符
  • -w:指定同等带宽输出

  • 这里写图片描述

eg:

# seq 1 2 10
1
3
5
7
9

数组和seq命令的应用

eg:选择双色球

要求写脚本实现如下图所示的功能。
这里写图片描述
答案:

#!/bin/bash
echo "欢迎购买福彩双色球,按任意键机选一注"
redball=($(seq 32))
echo -e "\033[31m红球:\n$(echo ${redball[@]})\033[0m"
blueball=($(seq 16))
echo -e "\033[34m蓝球:\n$(echo ${blueball[@]})\033[0m"
blen=${#blueball[@]}
for i in $(seq 6)
do
rlen=${#redball[@]}
rnum=$((RANDOM % rlen))
rb[x++]=${redball[rnum]}
unset redball[rnum]
redball=(${redball[@]})
done
bnum=$((RANDOM % blen))
bb=${blueball[bnum]}
read -n1 -s
echo -e "你的幸运号码是:******** \033[31m红球:${rb[@]}\033[0m \033[34m蓝球:$bb\033
[0m ********"

tr命令

字符转换工具,只能对stdin操作,不能直接对文件操作。
使用tr转换字符:
格式:tr set1 set2

  • 用set2中的字符替换掉set1中同一位置的字符(并没动源文件)
#echo 123456|tr 345 abc
#tr    123 abc < aa
#tr    '[a-z]'    '[A-Z]' < /etc/hosts
#echo    $PATH    |    tr  ':'   '\n' 
  • 删除字符 -d
    • 格式:tr -d set
    • 将stdin中数据流删除与set相同的字符
#echo 123456 | tr -d 345 
#df -h | tr -d %
  • 压缩字符 -s
    • 格式:tr -s SET
    • 将连续相同的字符压缩成一个字符

例子:

# echo 112233444555666 | tr -s 345
# ifconfig | tr -s ' '

格式:tr -s SET1 SET2
先替换为SET2再压缩

# echo 112233444555666 | tr -s 345 abc
# who | tr -s ‘ ‘  ‘\n’

sort 排序命令

默认按每行的第一个字符排序。

  • -n:按整数进行排序
  • -r:递减排序
  • -k:指定哪一列为排序键
    • #cat tt | sort -n -k4
  • -t:指定字段分割符(默认是空格)
    • #sort -t: -n -k3 /etc/passwd

uniq去重命令

删除经过排序后的数据的重复记录 ,通常和sort连用。例:
#sort -n tt | uniq

  • 数据的实例统计
    -c:统计特定记录出现的次数
    #cat tt | uniq -c
  • -u:只显示唯一的行
    #cat tt | uniq –u
  • -d:只显示重复的行
    #cat tt | uniq -d

cut 提取命令

从文本文件或者文本流中提取文本列。
格式:cut -选项 提取范围 文本文件

  • -c:从指定提取范围中提取字符
#ls -l | cut -c10
#who | cut -c 20-40
#cut -c -10 /etc/passwd
  • -f:从指定提取范围中提取字段
  • -d:指定分隔符。默认是Tab
#cut -d “:” -f 1,7 /etc/passwd
#who | cut  -d '  '  -f1,6
  • 提取范围:
    • n:第n项
    • n-:第n项到行尾
    • -m:行首到第m项
    • n,m:第n项和第m项
    • n-m:第n项到第m项

数组的用法–补充

利用循环为数组赋值:

#vi gate.sh
#!/bin/bash
for i in tom jerry lee mike
do
names[x++]=$i;
done
echo ${names[@]}

([x++]可以直接用,不用事先定义)

练习:

1.截取出本机上所有网卡的ip地址和子网掩码、默认网关
2.格式如下:
eth0 ip adreess is 172.16.1.1/16
eth1 ip adreess is 173.168.1.1/16
default gateway is 173.168.20.20
dns servers are 114.114.114.114 219.146.1.66

得到eth0和eth1的名字:
# ip add|grep "mtu"|awk '{print $2}'|tr -d :
得到eth0的ip地址:
#ifconfig eth0|grep "inet addr"|tr -s ':' ' '|cut -d' ' -f4
得到eth1的ip地址:
#ifconfig eth1|grep "inet addr"|tr -s ':' ' '|cut -d' ' -f4 
得到默认网关:
# route -n|grep "^192"|awk '{print $2}'
获得DNS:
# cat /etc/resolv.conf |grep " DNS1"|tr = ' '|awk '{print $3}'# cat /etc/resolv.conf |grep " DNS1"|tr = ' '|cut -d ' ' -f3

练习 :

1.只显示/boot目录下所有对象的实际空间,并按由小到大排序
2.统计/etc/passwd中每种shell的被使用次数
3.用fdisk -l命令只显示出分区和文件系统的类型
4.统计/etc/passwd文件中sbin这个单词出现多少次
5.用find命令查找/根目录下所有包含特殊权限的对象,并只显示出对象的权限和文件名称,不能显示错误提示
6.列出前5位占MEM最多的进程的命令
7.只显示网卡eth0的IP地址

答案:

①find /boot –exec ls -l {} \; | tr -s ' ' | cut -d' ' -f5 | grep -v ^$ | sort –n
②cat /etc/passwd | cut -d: -f7 | sort | tail -n +2 | uniq -c
③fdisk -l | grep ^/dev | tr -s '*' ' ' | cut -d' ' -f1,6-
④cat /etc/passwd | tr -s ':/ ' '\n' | sort | uniq -c | grep sbin
⑤find / -perm +7000 -exec ls -ld {} \; 2>/dev/null |tr -s ' ' | cut -d' ' -f1,9 | cut -c 2-10,12-
⑥ps aux | tr -s ' ' | tail -n +2 | sort -k4 -rn | head -5
⑦ifconfig eth0 | grep "inet addr" | tr -s ':' ' ' |cut -d' ' -f4

练习:

编写脚本统计指定目录下面文件占用空间大小超过10M的文件的数目和大小总和 (使用1个位置参数指定目录的绝对路径)

这里写图片描述

答案:

#!/bin/bash
all=$(find $1 -size +10240k -type f -exec ls -l {} \; 2> /dev/null | cut -d ' ' -f5 |tr '\
n' '+')
num=$(find $1 -size +10240k -type f -exec ls -l {} \; 2> /dev/null |wc -l )
((size=(${all}0)/1024/1024))
echo "超过10M的文件数目: $num"
echo "这些文件的总大小是: ${size}M“

j=0
for i in $(find $1 -type f | xargs du 2> /dev/null | cut -f1)
do
  (($i>10240)) && ((sum=sum+i)) && ((j++))
done
echo 大于10M的文件是:$j
echo 所有文件的总大小是:$((sum/1024))M

练习:

把/etc/passwd下面的所有用户截取出来放在一个数组里。
答案:

# user_name=($(cat /etc/passwd|awk -F: '{print $1}'))
# echo ${user_name[@]}

关联数组

(我认为:关联数组即可以自定义下标的特殊数组)

#declare -A name
#name=([user]=aa  [pwd]=bb  [age]=cc)
#echo ${name[@]}    --》显示数组全部元素
bb aa  cc
# echo ${#name[@]}    --》显示数组元素个数
3
# echo ${!name[@]}     --》显示数组下标
pwd user age
# echo ${name[user]}   --》显示下标为user的数组元素是啥
aa
posted @ 2017-10-20 22:52  斯言甚善  阅读(277)  评论(0编辑  收藏  举报