zoukankan      html  css  js  c++  java
  • 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 "33[31m红球:
    $(echo ${redball[@]})33[0m"
    blueball=($(seq 16))
    echo -e "33[34m蓝球:
    $(echo ${blueball[@]})33[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 "你的幸运号码是:******** 33[31m红球:${rb[@]}33[0m 33[34m蓝球:$bb33
    [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  ':'   '
    ' 
    • 删除字符 -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 ‘ ‘  ‘
    ’

    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 ':/ ' '
    ' | 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
  • 相关阅读:
    第01组 团队项目-需求分析报告
    团队项目-选题报告
    第08组 Beta冲刺(4/5)
    第08组 Beta冲刺(3/5)
    第08组 Beta冲刺(2/5)
    第08组 Beta冲刺(1/5)
    第08组 Alpha事后诸葛亮
    第08组 Alpha冲刺(6/6)
    第08组 Alpha冲刺(5/6)
    第08组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/lpeng94/p/12546495.html
Copyright © 2011-2022 走看看