Shell脚本应用场景举例

Shell脚本应用场景举例

@统计文件的行数

描述

写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数
示例:
假设 nowcoder.txt 内容如下:
#include
using namespace std;
int main()
{
int a = 10;
int b = 100;
cout << “a + b:” << a + b << endl;
return 0;
}
你的脚本应当输出:
9

方法
grep -n "" nowcoder.txt|awk -F: '{print }'|tail -n1| awk -F: '{print $1}'
awk '{print NR}' nowcoder.txt|tail -n1
awk 'END{print NR}' nowcoder.txt
sed -n '$=' nowcoder.txt
cat nowcoder.txt |wc -l

@打印文件的最后5行

描述

经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行
示例:
假设 nowcoder.txt 内容如下:
#include
using namespace std;
int main()
{
int a = 10;
int b = 100;
cout << “a + b:” << a + b << endl;
return 0;
}

你的脚本应当输出:
int a = 10;
int b = 100;
cout << “a + b:” << a + b << endl;
return 0;
}

方法

查看文件的前5行,可以使用head命令,
如 head -5 filename
查看文件的后5行,可以使用tail命令,
如: tail -5 filename 或 tail -n 5 filename
查看文件中间一段,你可以使用sed命令,
如: sed -n ‘5,20p’ filen

@输出7的倍数

描述

写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21…)的命令

方法
seq 0 7 500
#!/bin/bash
for i in {0..500}
    do
        if [[ i%7 -eq 0 ]];then
            echo $i
        fi
    done
#!/bin/bash
for i in {0..500..7}; do 
  echo  $i
done
#!/bin/bash
for((i=0;i<=500;i++))
do
  if [[ $((i%7)) == 0 ]]
  then echo $i
  fi
done

@输出第5行的内容

描述

写一个 bash脚本以输出一个文本文件 nowcoder.txt 中第5行的内容。

示例:
假设 nowcoder.txt 内容如下:
welcome
to
nowcoder
this
is
shell
code

你的脚本应当输出:
is

方法
head -n 5 nowcoder.txt | tail -n 1
sed -n '5p'
let j=0
for i in `cat nowcoder.txt`
do
    if [ $j -eq 4 ];then
        echo $i
    fi
    let j++
done
i=0
while read line;
do
    if [ $i -eq 4 ]
    then
        echo $line
        exit 0
    fi
    i=$[$i + 1]
done
sed -n  -e "5,5p" nowcoder.txt
awk -F : 'NR==5{print$0}' nowcoder.txt
awk '{if(NR==5){print $0}}' nowcoder.txt
#!/bin/bash
cat nowcoder.txt | sed -n "5p"
#!/bin/bash

count=1
cat nowcoder.txt | while read line
do
    if [ $count == 5 ]
    then
        echo $line
    fi
    count=$[ $count + 1 ]
done

@打印空行的行号

描述

写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始

示例:
假设 nowcoder.txt 内容如下:
a
b

c

d

e

f

你的脚本应当输出:
3
5
7
9
10

方法
awk '/^$/ {print NR}'
sed -n  '/^$/='  "nowcoder.txt"
#!/bin/bash
awk '{if($0 == "") {print NR}}' ./nowcoder.txt
#!/bin/bash
a=1
while read line
do
  if [ -z $line ];then
      echo $a
  fi
  a=$((a+1))
done < nowcoder.txt
#!/bain/bash
grep -n "^$"  nowcoder.txt | cut -d ":" -f 1

@去掉空行

描述

写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行
示例:
假设 nowcoder.txt 内容如下:
abc

567

aaa
bbb

ccc

你的脚本应当输出:
abc
567
aaa
bbb
ccc

方法
sed -n '/[^$]/p'
cat nowcoder.txt | awk NF
 grep -v '^$' 
 grep -E  '\S+'
awk NF # ?
awk '!/^$/{print $NF}' 
while read line
do
    if [ -z $line ]
    then
        continue
    fi
    echo $line
done
#!/bin/bash
while read line
do 
    if [ ! -z $line ];then
        echo $line
    fi
done

@打印字母数小于8的单词

描述

写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词。

示例:
假设 nowcoder.txt 内容如下:
how they are implemented and applied in computer

你的脚本应当输出:
how
they
are
and
applied
in

说明:
不要担心你输出的空格以及换行的问题

方法
cat nowcoder.txt | awk '{
for (i=1;i<=NF;i++){
    if (length($i) < 8)
        print $i
    }
}'
awk 'BEGIN{FS="";RS=" ";ORS="\n"}{if(NF<8)print$0}' nowcoder.txt
for i in `cat nowcoder.txt`
do
    if [ $(echo $i |wc -L ) -lt 8 ];then
        echo $i
    fi
done
for i in `awk '{print}' nowcoder.txt`
do
    if [ ${#i} -lt 8 ]
    then
        echo $i
    fi
done
cat nowcoder.txt | xargs -n 1 | awk 'length($1)<8 {print $1}'
for i in `cat nowcoder.txt`
do
    if [ `echo $i | wc -m` -lt 9 ]
    then
        echo $i
    fi
done
for str in $(cat nowcoder.txt)
do
    len=$(expr length $str)
    if [[ $len -lt 8 ]]
    then
        echo "$str"
    fi
done

@统计所有进程占用内存大小的和

描述

假设 nowcoder.txt 内容如下:
root 2 0.0 0.0 0 0 ? S 9月25 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< 9月25 0:00 [kworker/0:0H]
web 1638 1.8 1.8 6311352 612400 ? Sl 10月16 21:52 test
web 1639 2.0 1.8 6311352 612401 ? Sl 10月16 21:52 test
tangmiao-pc 5336 0.0 1.4 9100240 238544 ?? S 3:09下午 0:31.70 /Applications

以上内容是通过ps aux | grep -v ‘RSS TTY’ 命令输出到nowcoder.txt文件下面的
请你写一个脚本计算一下所有进程占用内存大小的和:

方法
awk '{a+=$6}END{print a}'
sum=0
while read line
do 
    arr=(${line[@]})
    sum=$(($sum+arr[5]))
done<nowcoder.txt;
echo $sum 
sum=0
while read line
do 
    arr=($line)
    ((sum+=arr[5]))
done<nowcoder.txt
echo $sum

@统计每个单词出现的个数

描述

写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数。

为了简单起见,你可以假设:
nowcoder.txt只包括小写字母和空格。
每个单词只由小写字母组成。
单词间由一个或多个空格字符分隔。

示例:
假设 nowcoder.txt 内容如下:
welcome nowcoder
welcome to nowcoder
nowcoder
你的脚本应当输出(以词频升序排列):
to 1
welcome 2
nowcoder 3

说明:
不要担心个数相同的单词的排序问题,每个单词出现的个数都是唯一的。

方法
cat $1  | tr -s ' ' '\n' |sort |uniq -c|sort |awk '{print $2" "$1}'
cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){print $i}}'|sort|uniq -c| sort -n | awk '{print $2,$1}'
cat nowcoder.txt | tr -s ' ' '\n' | sort | uniq -c | awk '{print $2" "$1}' | sort -k2n
declare -A map

while read linestr
do
    arr=($linestr)
    for key in ${arr[@]}
    do
        if [ -z "${map[$key]}" ];then
            map[$key]=1
        else
            ((map[$key]++))
        fi
    done
done<nowcoder.txt
mm=()
for vlaue in ${map[@]}
do
   mm[${#mm[@]}]=${vlaue}
done

for ((a=0;a<${#mm[*]};a++));do
  for ((k=$a+1;k<${#mm[*]};k++));do
    if [ ${mm[$a]} -gt ${mm[$k]} ];then
        qq=${mm[$a]}
        mm[$a]=${mm[$k]}
        mm[$k]=$qq
    fi
 done
done

for ((k=0;k<${#mm[*]};k++));do
 for key in ${!map[@]};do
    if [ ${map[$key]} -eq ${mm[$k]} ];then
        echo $key ${map[$key]}
    fi
 done
done
awk '{
    for(i=1;i<=NF;i++){voc[$i]++;}
} END{
    for(w in voc){print w" "voc[w];}
}' $1 | sort -k2,2 -n
tr ' ' '\n' | sort | uniq -c | awk '{print $2, $1}' | sort -nk2
awk '{
 for (i = 1; i <= NF; ++i)
     mp[$i]++;
}
END {
 for (k in mp)
     printf("%s %d", k, mp[k]);
}' | sort -n -k1
cat nowcoder.txt |xargs -n 1 |sort |uniq -c | sort -n | awk '{print $2,$1}'

@第二列是否有重复

描述

给定一个 nowcoder.txt文件,其中有3列信息,如下实例,编写一个sheel脚本来检查文件第二列是否有重复,且有几个重复,并提取出重复的行的第二列信息:
实例:
20201001 python 99
20201002 go 80
20201002 c++ 88
20201003 php 77
20201001 go 88
20201005 shell 89
20201006 java 70
20201008 c 100
20201007 java 88
20201006 go 97

结果:
2 java
3 go

方法
awk '{print $2}' nowcoder.txt | sort | uniq -cd | sort -n
cat  $1 |awk '{print $2}'  |sort  |uniq -c|sort |grep -v 1
awk '{a[$2]++} END{for(i in a) {if(a[i]>=2){print a[i]" "i}}}' nowcoder.txt 

@转置文件的内容

描述

写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容。

为了简单起见,你可以假设:
你可以假设每行列数相同,并且每个字段由空格分隔

示例:
假设 nowcoder.txt 内容如下:
job salary
c++ 13
java 14
php 12

你的脚本应当输出(以词频升序排列):
job c++ java php
salary 13 14 12

方法
#!/bin/bash
awk '{printf  $1" "}' nowcoder.txt
awk '{printf $2" "}' nowcoder.txt
awk '{
    for (i = 1; i <= NF; i++){
        if (NR == 1) {
            array[i] = $i
        } else {
            array[i] = array[i] $i
        }
    }
} END {
    for(j = 1; j <= NF; j++){
        print array[j]
    }
}' nowcoder.txt
awk '{
    for(i=1;i<=NF;i++){rows[i]=rows[i]" "$i}
} END{
    for(line in rows){print rows[line]}
}' $1
a=`head -n1 "nowcoder.txt" |awk -F ' ' '{print NF}'`
i=1
while [  $i -le  $a ];
do
    line=`cat "nowcoder.txt"|awk '{print $'$i'}'`
    echo $line
    let i+=1
done   
columns=$(head -n1 nowcoder.txt | wc -w)

for (( row=1; row<=columns; ++row )); do
    cut -d" " -f"${row}" nowcoder.txt | xargs
done
transpose-file() {
 local array=()
 local width=0
 local height=0
 for ((h = 0; ; h++)); do
     read -r -a line
     if [ 0 -eq ${#line[@]} ]; then
         break
     fi
     width=${#line[@]}
     height=$((height+1))
     for ((w = 0; w < width; w++)); do
         array[$((h*width+w))]=${line[$w]}
     done
 done
 for ((w = 0; w < width; w++)); do
     for ((h = 0; h < height; h++)); do
         echo -n "${array[$((h*width+w))]}"
         # newline
         if [ $((h+1)) -eq $height ] ; then
             echo ""
         # just a space
         else
             echo -n " "
         fi
     done
 done
}
transpose-file

@打印每一行出现的数字个数

描述

写一个 bash脚本以统计一个文本文件 nowcoder.txt中每一行出现的1,2,3,4,5数字个数并且要计算一下整个文档中一共出现了几个1,2,3,4,5数字数字总数。

示例:
假设 nowcoder.txt 内容如下:
a12b8
10ccc
2521abc
9asf
你的脚本应当输出:
line1 number: 2
line2 number: 1
line3 number: 4
line4 number: 0
sum is 7

说明:
不要担心你输出的空格以及换行的问题

方法
cnt=1
sum=0
while read line
do
    r=`echo $line | grep -oE "[12345]" | wc -l`
    echo "line${cnt} number: ${r}"
    let "cnt++"
    let "sum+=$r"
done 
echo "sum is ${sum}" < nowcoder.txt 
awk '{
    gsub(/[^1-5]/,"",$0);
    print "line"NR" number: "length($0);
    sum+=length($0);
} END{ print "sum is "sum }'
coutline=0
count=0
sum=0
while read line
do
    for((i=0;i<${#line};i++));do
        if [[ ${line:$i:1} =~ [1-5] ]];then
            let count=count+1
        fi
    done
    let coutline=coutline+1
    echo "line${coutline} number: ${count}"
    let sum=sum+count
    count=0
done<./nowcoder.txt
echo "sum is ${sum}"
awk '{
count=0;
len=length($0);
for(i=1;i<=len;i++)
    {s=substr($0,i,1)
    if(0<s && s<6)
        {total++;
        count++}};
        printf("line%d number:%d\n",NR,count);}
END{printf("sum is %d\n",total)}'

@去掉所有包含this的句子

描述

写一个 bash脚本以实现一个需求,去掉输入中含有this的语句,把不含this的语句输出
示例:
假设输入如下:
that is your bag
is this your bag?
to the degree or extent indicated.
there was a court case resulting from this incident
welcome to nowcoder

你的脚本获取以上输入应当输出:
to the degree or extent indicated.
welcome to nowcoder

说明:
你可以不用在意输出的格式,包括空格和换行

方法
sed '/this/d'
grep -v 'this'
awk '$0!~/this/ {print $0}'
cat $1 |grep -v "this"

@求平均值

描述

写一个bash脚本以实现一个需求,求输入的一个的数组的平均值

第1行为输入的数组长度N
第2~N行为数组的元素,如以下为:
数组长度为4,数组元素为1 2 9 8
示例:
4
1
2
9
8

那么平均值为:5.000(保留小数点后面3位)
你的脚本获取以上输入应当输出:
5.000

方法
awk 'NR==1{all=$0} NR>1{total+=$0} END{printf "%.3f" ,total/all}'
read cnt
sum=0
cnt_cp=0
while [ $cnt -gt 0 ]
do
    read num
    let "sum+=num"
    let "cnt--"
    let "cnt_cp++"
done
echo "scale=3;$sum/$cnt_cp" | bc
i=1
SUM=0
cat $1 |while read line
do
    if [ $i -eq 1 ];then
        number=$line
        let i+=1
    else
        let SUM+=line
        let i+=1
    fi
    if [ $i -gt $(($number+1)) ];then
        result=`awk 'BEGIN{printf "%.3f\n",'$SUM'/'$number'}'`
        echo $result
    fi
done

@去掉不需要的单词

描述

写一个 bash脚本以实现一个需求,去掉输入中的含有B和b的单词
示例:
假设输入如下:
big
nowcoder
Betty
basic
test

你的脚本获取以上输入应当输出:
nowcoder test

说明:
你可以不用在意输出的格式,空格和换行都行

方法
grep -v -E 'b|B' nowcoder.txt
grep -iv "b"
grep -v '[bB]' 
awk '$0!~/b|B/ {print $0}' nowcoder.txt
awk '!/[bB]/'
sed '/[Bb]/d'
sed '/b\|B/d'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值