牛客Shell面试题

1.编写一个shell脚本以输出一个文本文件nowcoder.txt中的行数

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

#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int b = 100;
    cout << "a + b:" << a + b << endl;
    return 0;
}

你的脚本应当输出:
9

答案:

#!/bin/bash
#方法一:wc -l取出行数,awk过滤掉文件名
wc -l ./nowcoder.txt | awk '{print $1}'

#方法二:awk直接打印行号,再通过tail取最后一行行号
awk '{print NR}' ./nowcoder.txt | tail -n 1

#方法三:awk打印行号并END取最后一行
awk 'END{print NR}' ./nowcoder.txt

#方法四:grep -c直接取行数
grep -c "" ./nowcoder.txt

#方法五:grep -n给每一行加行号,最后再去掉冒号和后面的原文内容
grep -n "" ./nowcoder.txt | awk -F ":" '{print $1}' | tail -n 1

#方法六:$定位结尾,=取行号
sed -n '$=' ./nowcoder.txt

2.查看日志的时候,经常会从文件的末尾往前查看,请你写一个bash shell脚本以输出一个文本文件nowcoder.txt中的最后5行。

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

#include<iostream>
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;
}

答案:

#!/bin/bash
tail -5 ./nowcoder.txt
tail -n5
tail -n 5

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

答案:

#!/bin/bash
#方法一:类似于java的写法
for((i=0;i<=500;i++))
do
  if [[ $((i%7)) == 0 ]]
  then echo $i
  fi
done

#方法一变体1:对for的简写
for i in {0..500}
do
    if [[ i%7 -eq 0 ]]
        then echo $i
    fi
done

#方法一变体2:中if简写
for i in {0..500}
do 
    [[ i%7 -eq 0 ]] && echo $i
done

#方法二:采用循环步长7
for i in {0..500..7}; do 
  echo  $i
done

#方法三:echo打印并将空格转为换行
echo {0..500..7} | tr " " "\n"

#方法四:输出序列0-500并用awk做过滤
seq 0 500 | awk '$i%7==0 {print $i}'

#方法五:从第一行开始每隔7行取一个
seq 0 500 | sed -n '1~7p'

#方法六:输出序列0-500,步长7
seq 0 7 500

#为了正常结束
exit 0

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

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

welcome
to
nowcoder
this
is
shell
code

你的脚本应当输出:
is

答案:

#!/bin/bash
#先选前五行,再选最后一行
head -5 ./nowcoder.txt | tail -1

#5p代表选择第五行
sed -n '5p'

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

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

a
b

c

d

e


f

你的脚本应当输出:

3
5
7
9
10

答案:

#!/bin/bash
#方法一:正则匹配之后打上行号,并过滤掉冒号
grep -n '^\s*$' | awk -F ":" '{print $1}'

#方法二:使用awk正则匹配后直接打印行号
awk '/^\s*$/{print NR}'

#方法三:使用sed -n的=打印行号
sed -n '/^\s*$/='

6.写一个 bash脚本以去掉一个文本文件nowcoder.txt中的空行

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

abc

567


aaa
bbb



ccc

你的脚本应当输出:

abc
567
aaa
bbb
ccc

答案:

#!/bin/bash
#方法一:awk判断当前行是否为空,非空则打印
awk '{if($i != "") {print $i}}'
awk '!/^$/ {print $NF}'
awk NF

#方法二:grep -v显示不包含匹配文本的所有行,-e指定字符串作为查找内容样式
grep -v '^$'
grep -e '\S'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值