linux系统bash文本处理

1.实验任务

1、用bash编写一个文本批处理脚本,对以下2014世界杯运动员数据(点击下载文件)附件分别进行批量处理完成相应的数据统计任务:

                统计不同年龄区间范围(20岁以下、[20-30]、30岁以上)的球员数量、百分比

                统计不同场上位置的球员数量、百分比

                名字最长的球员是谁?名字最短的球员是谁?

                年龄最大的球员是谁?年龄最小的球员是谁?

analyze_player.sh(先在自己宿主机创建一个脚本文件)

#!/bin/bash

# 设置输入文件
input_file="worldcupplayerinfo.tsv"

# 1. 统计不同年龄区间的球员数量和百分比
echo "=== 年龄分布统计 ==="
total_players=$(wc -l < "$input_file")
echo "总球员数: $total_players"

echo -e "\n年龄区间分布:"
awk -F'\t' '
BEGIN { 
    under20=0
    age20to30=0
    over30=0
}
$6 ~ /^[0-9]+$/ && $6 > 0 {  # 确保年龄是有效的数字
    if($6 < 20) under20++
    else if($6 <= 30) age20to30++
    else over30++
}
END {
    printf "20岁以下: %d (%.2f%%)\n", under20, (under20/NR)*100
    printf "20-30岁: %d (%.2f%%)\n", age20to30, (age20to30/NR)*100
    printf "30岁以上: %d (%.2f%%)\n", over30, (over30/NR)*100
}' "$input_file"

# 2. 统计不同位置的球员数量和百分比
echo -e "\n=== 位置分布统计 ==="
awk -F'\t' '
{
    position[$5]++
}
END {
    for(pos in position)
        printf "%s: %d (%.2f%%)\n", pos, position[pos], (position[pos]/NR)*100
}' "$input_file" | sort

# 3. 找出名字最长和最短的球员
echo -e "\n=== 名字长度统计 ==="
awk -F'\t' '
BEGIN {
    max_len = 0
    min_len = 999
    max_name = ""
    min_name = ""
}
{
    name_len = length($9)
    if(name_len > max_len) {
        max_len = name_len
        max_name = $9
    }
    if(name_len < min_len) {
        min_len = name_len
        min_name = $9
    }
}
END {
    printf "名字最长的球员: %s (长度: %d)\n", max_name, max_len
    printf "名字最短的球员: %s (长度: %d)\n", min_name, min_len
}' "$input_file"

# 4. 找出年龄最大和最小的球员
echo -e "\n=== 年龄统计 ==="
awk -F'\t' '
BEGIN {
    max_age = 0
    min_age = 999
    max_name = ""
    min_name = ""
}
$6 ~ /^[0-9]+$/ && $6 > 0 {  # 确保年龄是有效的数字
    if($6 > max_age) {
        max_age = $6
        max_name = $9
    }
    if($6 < min_age) {
        min_age = $6
        min_name = $9
    }
}
END {
    printf "年龄最大的球员: %s (%d岁)\n", max_name, max_age
    printf "年龄最小的球员: %s (%d岁)\n", min_name, min_age
}' "$input_file" 

2、用bash编写一个文本批处理脚本,对以下Web服务器访问日志(点击下载文件)附件分别进行批量处理完成相应的数据统计任务:

                统计访问来源主机TOP 100和分别对应出现的总次数

                统计访问来源主机TOP 100 IP和分别对应出现的总次数

                统计最频繁被访问的URL TOP 100

                统计不同响应状态码的出现次数和对应百分比

                分别统计不同4XX状态码对应的TOP 10 URL和对应出现的总次数

                给定URL输出TOP 100访问来源主机

analyze_web_log.sh(先在自己宿主机创建一个脚本文件)

#!/bin/bash

function HELP
{
  echo "usage:[-s][-i][-u][-c][-e][-o][-h]"
  echo "      -s          统计访问来源主机TOP 100和分别对应出现的总次数"
  echo "      -i          统计访问来源主机TOP 100 IP和分别对应出现的总次数"
  echo "      -u          统计最频繁被访问的URL TOP 100"
  echo "      -c          统计不同响应状态码的出现次数和对应百分比"
  echo "      -e          分别统计不同4XX状态码对应的TOP 10 URL和对应出现的总次数"
  echo "      -o [url]    给定URL输出TOP 100访问来源主机"
  echo "      -h          查看帮助文档"
}

function Operate
{
  case $1 in
    1) sed -n '2, $ p' web_log.tsv | awk -F '\t' '{a[$1]++} END{for(i in a) {print (i,a[i])}}' | sort -nr -k2 | head -n 100
       ;;
    2) sed -n '2, $ p' web_log.tsv | awk '{if ($1~/^([0-2]*[0-9]*[0-9])\.([0-2]*[0-9]*[0-9])\.([0-2]*[0-9]*[0-9])\.([0-2]*[0-9]*[0-9])$/){print $1}}' | awk -F '\t' '{a[$1]++} END{for(i in a) {print (i,a[i])}}' | sort -nr -k2 | head -n 100
       ;;
    3) sed -n '2, $ p' web_log.tsv | awk -F '\t' '{a[$5]++} END{for(i in a) {print (i,a[i])}}' | sort -nr -k2 | head -n 100
       ;;
    4) sed -n '2, $ p' web_log.tsv | awk -F '\t' 'BEGIN{ans=0}{a[$6]++;ans++} END{for(i in a) {printf "%d\t%d\t%.3f%%\n", i, a[i], a[i]*100/ans}}' | sort -n
       ;;
    5) sed -n '2, $ p' web_log.tsv | awk -F '\t' '{if($6~/^4+[0-9]*[0-9]$/) {a[$5]++}} END{for (i in a) {print i,a[i]}}' | sort -nr -k2 | head -n 10
       ;;
    6) sed -n '2, $ p' web_log.tsv | awk -F '\t' '{if($5=="'$2'") {a[$1]++}} END{for (i in a) {print i,a[i]}}' | sort -nr -k2 | head -n 100
       ;;
     esac
}

function main
{
  ans=0
  var=($*)

  if [ ${#var[@]} -ge 1 ];then
    for j in "${var[@]}";
    do
      case $j in
        "-o") ans=$((ans+1))
              Operate 6 "${var["$ans"]}"
              ;;
        "-s") Operate 1
              ;;
        "-i") Operate 2
              ;;
        "-u") Operate 3
              ;;
        "-c") Operate 4
              ;;
        "-e") Operate 5
              ;;
        "-h") HELP
              ;;
            esac
    ans=$((ans+1))
    done
  else
    HELP
  fi
}

main $1 $2 $3 $4 $5 $6 $7

2.实验步骤

1、下载工具包,宿主机虚拟机互传文件

先下载open-vm-tools、open-vm-tools-desktop工具包,下载完成后重启虚拟机

apt install open-vm-tools open-vm-tools-desktop

下载完工具包后,就可以将宿主机的文件直接复制粘贴到ubuntu虚拟机中

open-vm-tools:VMware 虚拟机的工具,提供虚拟机与主机交互功能,比如共享文件夹、调整屏幕分辨率。

open-vm-tools-desktop:桌面环境扩展,支持更多图形相关功能,比如拖拽文件、自动调整显示。

将我们的脚本文件以及被检索的文件放在同一个文件夹里面,然后复制该文件夹

然后进入ubuntu虚拟机,鼠标右键,点击Paste,然后文件就可以直接被复制到虚拟机

如果出现以下窗口,点Skip All即可,没有则不用理会

然后基于该文件夹打开终端,鼠标放在文件夹处然后右键,点Open in Terminal

2、对于用bash编写一个文本批处理脚本,对以下2014世界杯运动员数据附件分别进行批量处理完成相应的数据统计任务:

chmod +x analyze_player.sh  //为 analyze_player.sh 文件添加执行权限
./analyze_player.sh

3、对于用bash编写一个文本批处理脚本,对以下Web服务器访问日志附件分别进行批量处理完成相应的数据统计任务:

同理

chmod +x analyze_web_log.sh
./analyze_web_log.sh

bash analyze_web_log.sh -s

bash analyze_web_log.sh -i

bash analyze_web_log.sh -u

bash analyze_web_log.sh -c

bash analyze_web_log.sh -e

bash analyze_web_log.sh -o /shuttle/missions/sts-68/ksc-upclose.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值