文章目录
- awk内置函数
- 牛客shell练习
- 写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数
- 末尾查看
- 写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21...)的命令
- 输出第5行的内容
- 写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始
- 去掉文本中的空行
- 写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词
- 计算所有进程占用内存大小的和
- 统计每个单词出现的个数
- 输出第二列中有重复的次数
- 写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容
- 统计nowcoder.txt中每一行的1~5数字个数
- 去掉所有包含this的语句
- 求输入的数组的平均值
- 去掉输入中含有B和b的单词
awk内置函数
split
格式: split(string,array,field separator) 字符串,放到哪个数组,用来分的分隔符
分隔符不给,默认是FS的
name="Tom:John:Tack"
out=`echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'`
echo $out
Tom John Tack #被分成三个了
substr 截取字符串
格式:substr(s,p) 返回字符串s中从p开始的子串 起始为1
格式:substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
echo "123456" | awk '{print substr($0,1,1)}'
1
echo "123456" | awk '{print substr($0,2,1)}'
2
echo "123456" | awk '{print substr($0,1,5)}'
12345
length 字符串长度
awk '{print length(123)}'
3
gsub 使得所有正则表达式被匹配的时候都发生替换
格式:gsub(regular expression,subsitution string,target string)
cat abc.txt
abc
abc
#替换abc.txt中的abc为def
awk '/abc/{gsub("abc","def",$0);print $0}' abc.txt
def
def
牛客shell练习
写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数
#!/bin/bash
line=`cat nowcoder.txt` | wc -l
echo $line
末尾查看
#!/bin/bash
tail -n 5 nowcoder.txt
写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21…)的命令
#!/bin/bash
for i in $(seq 0 500)
do
if [[ "((i % 7))" -eq 0 ]]; then
echo $i
fi
done
#===================================================
#或者
for i in {0..500..7}
do
echo $i
done
输出第5行的内容
#!/bin/bash
#awk 'NR==5{print $0}' nowcoder.txt
awk '{if(NR==5)print $0}' nowcoder.txt
#或者
sed -n '5p' nowcoder.txt
写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始
#!/bin/bash
awk '/^$/{print NR}' nowcoder.txt
去掉文本中的空行
#!/bin/bash
awk '!/^$/{print $0}' nowcoder.txt
写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词
#!/bin/bash
awk '{for(i=1;i<=NF;i++){if(length($i)<8){print $i}}}' nowcoder.txt
#还有${#i}得到长度
#还有管道给 | wc -m 获得长度
计算所有进程占用内存大小的和
内容为ps aux | grep -v ‘RSS TTY’ > nowcoder.txt
#!/bin/bash
awk '
BEGIN{sum=0}
{sum+=$6}
END{print sum}
' nowcoder.txt
统计每个单词出现的个数
写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数。
为了简单起见,你可以假设:
nowcoder.txt只包括小写字母和空格。
每个单词只由小写字母组成。
单词间由一个或多个空格字符分隔
#!/bin/bash
cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){sum[$i]++}} END{for(key in sum){print sum[key]" "key}}' | sort \
|uniq -c | awk '{print $3" "$2}'
#sort 排序 特意将次数输出在第一位
#uniq 去除重复 虽然应该没有
输出第二列中有重复的次数
给定一个 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
#!/bin/bash
awk '{
count[$2]++
}
END{
for(key in count)
if(count[key] >= 2)
print count[key]" "key
}' nowcoder.txt
写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容
#示例:
假设 nowcoder.txt 内容如下:
job salary
c++ 13
java 14
php 12
#!/bin/bash
awk '{for(i=1;i<=NF;i++) arr[i]=arr[i]" "$i} END{for(i=1;i<=NF;i++) print substr(arr[i],2)}' nowcoder.txt
#利用数组将每列的字符串组合,通过sbustr(字符串,起始位置,终止位置)内置函数来输出 2是因为开局的空格
#或者
awk '{print $1}' nowcoder.txt | xargs #xargs横向输出和管道连用 -n指定个数
awk '{print $2}' nowcoder.txt | xargs
统计nowcoder.txt中每一行的1~5数字个数
示例:
假设 nowcoder.txt 内容如下:
a12b8
10ccc
2521abc
9asf
你的脚本应当输出:
line1 number: 2
line2 number: 1
line3 number: 4
line4 number: 0
sum is 7
#!/bin/bash
awk '
BEGIN{
Sum=0
}
{ #计算每行的数字个数
LineSum=0
len=length($0)
#print len
for(i=1;i<=len;i++) #循环字符串字符数
{
if(substr($0,i,1)>=1 && substr($0,i,1) <= 5) #substr截取比较
{
LineSum++
Sum++
}
}
print "line"NR" number:"LineSum
}
END {
print "sum is "Sum
}
' nowcoder.txt
去掉所有包含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
**
#!/bin/bash
while read line
do
flag=0
for i in $line
do
if [[ $i == "this" ]]; then
flag=1
break
fi
done
if [[ $flag -eq 0 ]]; then
echo $line
fi
done < nowcoder.txt
=====================================================
#或者
#!/bin/bash
awk '!/this/{print}' nowcoder.txt
求输入的数组的平均值
第1行为输入的数组长度N
第2~N行为数组的元素,如以下为:
数组长度为4,数组元素为1 2 9 8
示例:
4
1
2
9
8
#!/bin/bash
Len=`head -n1 nonwcoder.txt` nowcoder.txt
Sum=`awk 'BEGIN{sum=0} NR!=1{sum+=$0} END{print sum}'` nowcoder.txt
echo "scale=3;$Sum/$Len" | bc
去掉输入中含有B和b的单词
示例:
假设输入如下:
big
nowcoder
Betty
basic
test
#!/bin/bash
grep -iv 'b' nowcoder.txt #i不区分大小写 v取反