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'