本专题为Shell实战,包含各种常见的Shell基本命令和操作,比如awk和sed等。
写一个 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;
}
方法1:
$ wc -l ./nowcoder.txt
8 ./nowcoder.txt
wc -l ./nowcoder.txt|awk '{print $1}'
8
方法2:
$ awk '{print NR}' ./nowcoder.txt
1
2
3
4
5
6
7
8
9
awk '{print NR}' ./nowcoder.txt|tail -n 1
9
经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行
tail -n 5
写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21…)的命令
for i in {0…500…7}
do
echo $i
done
写一个 bash脚本以输出一个文本文件 nowcoder.txt 中第5行的内容。
sed -n 5p ./nowcoder.txt
写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始
示例:
假设 nowcoder.txt 内容如下:
a
b
c
d
e
f
答案为:
3
5
7
9
10
awk '/^$/{print NR}' ./nowcoder.txt##方法1
sed -n '/^$/=' ./nowcoder.txt##方法2
awk '{if(NF==0)print NR}' ./nowcoder.txt##方法3
写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行
sed '/^$/d' ./nowcoder.txt|awk '{print $0}'##方法1:先删除空行,再打印剩下的内容(列)
awk '{if($0 !=""){print $0}}' ./nowcoder.txt##方法1:如果该列内容不为空,就打印该列的内容(列)
awk '!/^$/ {print $NF}'
awk NF ./nowcoder.txt
grep -v '^$' ./nowcoder.txt##显示不包含匹配文本的所有行。
写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词。
方法1:
for i in `cat test2`
do
if [ `echo $i |wc -m` -lt 9 ];then %wc -m表示统计字符个数,注意每行最后的换行符也是个字符
echo $i
fi
done
方法2:
for i in `cat test2`
do
if [ $(echo $i |wc -L) -lt 8 ];then %wc -L表示统计单词最大长度
echo $i
fi
done
方法3:
cat test2 | awk '{
for (i=1;i<=NF;i++){
if (length($i) < 8)
print $i
}
}'
整数比较判断语句
-eq(equal) | 测试两个整数是否相等;比如 $A -eq $B |
-ne(inequality) | 测试两个整数是否不等;不等,为真;相等,为假; |
-gt(greter than) | 测试一个数是否大于另一个数;大于,为真;否则,为假; |
-lt(less than) | 测试一个数是否小于另一个数;小于,为真;否则,为假; |
-ge(greter equal) | 大于或等于 |
-le(less equal) | 小于或等于 |
请你写一个脚本计算一下所有进程占用内存大小的和:
ps aux | grep -v 'RSS TTY' | head -n 10 > now.txt
vim file3.sh
#!/bin/bash
sum=0
while read line
do
arr=(${line[@]})
sum=$(($sum+arr[5]))
done
写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数。
cat $1 | tr -s ’ ’ ‘\n’ |sort |uniq -c|sort |awk ‘{print $2" "$1}’
##tr -s 去掉空行,uniq -c合并重复并统计重复个数。sort按顺序排列,awk交换第一列和第二列
给定一个 nowcoder.txt文件,其中有3列信息,如下实例,编写一个sheel脚本来检查文件第二列是否有重复,且有几个重复,并提取出重复的行的第二列信息:
cat ./nowcoder.txt |awk '{print $2}'|sort|uniq -c |sort|grep -v 1
cat ./nowcoder.txt |sort -k 2|awk '{print $2}'|uniq -c |sort|grep -v 1
结果:
2 java
3 go
写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容。
方法1
awk '{printf $1" "}' ./nowcoder.txt
awk '{printf $2" "}' ./nowcoder.txt
#方法2
awk '{print $1}' ./nowcoder.txt | tr "\n" " "
awk '{print $2}' ./nowcoder.txt | tr "\n" " "
写一个 bash脚本以统计一个文本文件 nowcoder.txt中每一行出现的1,2,3,4,5数字个数并且要计算一下整个文档中一共出现了几个1,2,3,4,5数字数字总数。
awk '{
gsub(/[^1-5]/,"",$0);
print "line"NR" number: "length($0);
sum+=length($0);
} END{print "sum is "sum}'
方法1:
grep -v 'this' ./nowcoder.txt %反向匹配
方法2:
sed '/this/d'./nowcoder.txt %d:删除 “//”: 包含要搜索的字符串
方法3:
sed -n 'this/!p' ./nowcoder.txt
方法4:
awk '$0!~/this/ {print $0}' ./nowcoder.txt %检查当前$0(所有的列)不包含this随机输出
写一个bash脚本以实现一个需求,求输入的一个的数组的平均值
第1行为输入的数组长度N
第2~N行为数组的元素
方法1
awk '{if(NR!=1)a+=$1} END{printf("%.3f\n",a/(NR-1))}'
方法2
awk 'BEGIN{SUM=0;}{if(NR!=1){sum+=$1;}}END{printf("%.3f\n",sum/(NR-1))}'
方法3
#!/bin/bash
read -p "数组长度:" cnt
for ((i=1;i<=cnt;i++)){
read num;
sum=$(($sum+$num));
}
a=`awk 'BEGIN{printf("%.3f\n",'$sum'/'$cnt')}'`
echo $a
写一个 bash脚本以实现一个需求,去掉输入中的含有B和b的单词
grep -v -E 'b|B' nowcoder.txt
grep -iv "b"
grep -v '[bB]'
cat nowcoder.txt | grep -v -E 'b|B'
cat nowcoder.txt|grep -vi "b"
awk '$0!~/b|B/ {print $0}' nowcoder.txt
awk '!/[bB]/'
sed '/[Bb]/d'
sed '/b\|B/d'