1、 用 sed 修改 test.txt 的 23 行 test 为 tset。
sed -i '23s/test/tset/g' test.txt
-i表示修改原文件
g表示替换全部的test
2、 查看 web.log 第 25 行第三列的内容。
NO.1 sed -n '25p' web.log | awk -F ' ' '{print $3}'
NO.2 awk -F ' ' 'NR == 25{print$3}' web.log
NO.3 head -n 25 web.log | tail -n 1 | awk -F ' ' '{print $3}'
第一种写法里-n选项表示“静默模式”,也称为“安静模式”。当sed命令使用-n选项时,它将不会输出文本文件的内容,而只会在处理完指定的命令之后输出所需的内容。
第二种写法NR == 25来匹配文件的第25行,然后使用print $3来打印该行的第3个字段。
第三种写法提取web.log文件的前25行,再使用tail命令提取最后一行中的第三列
3、 删除文件 tmp.txt 的前三行。
NO.1 sed -i '1,3d' tmp.txt
NO.2 tail -n +4 > tmp1.txt && rm tmp.txt && mv tmp1.txt tmp.txt
NO.3 awk 'NR>3{print}' > tmp1.txt && rm tmp.txt && mv tmp1.txt tmp.txt
第二种写法tail -n +4表示从文件的第4行开始输出,将结果重定向到一个临时文件tmp1.txt中,然后将tmp1.txt文件重命名为tmp.txt,以达到删除前三行的效果。
4、 写一个脚本,求 1000 内的质数。
脚本一:
#!/bin/bash
for((i=2;i<=1000;i++))
do
flag=1
for((j=2;j*j<=i;j++))
do
if((i%j==0));then
flag=0
break
fi
done
if((flag==1));then
echo $i
fi
done
脚本二:
#!/bin/bash
vector=()
for((i=0;i<=1000;i++))
do
vector[i]=1
done
for((i=2;i*i<=1000;i++))
do
if((vector[i]==1));then
flag=1
for((j=2;j*j<=i;j++))
do
if((i%j==0));then
flag=0
break
fi
done
if((flag==1));then
for((n=2;i*n<=1000;n++))
do
vector[i*n]=0
done
fi
fi
done
for((i=2;i<=1000;i++))
do
if((vector[i]==1));then
echo $i
fi
done
脚本三
#!/bin/bash
for i in `seq 1 2 1000`;do
tmp=$(echo "sqrt($i)" | bc)
flag=1
j=2
while ((j * j <= i));do
if [ $(( i % j )) -eq 0 ];then
flag=0
break
fi
((j++))
done
if [ $flag -eq 1 ];then
echo $i
fi
done
重要补充:关于循环条件的几种写法评析
在循环中使用 ((i = 1; i <= 1000; i++))
,seq 1 1000
,或者{1..1000}
都可以,这三种方法都是很常见的迭代方法。不过,这些方法有一些区别和优劣,可以根据具体情况进行选择。
((i = 1; i <= 1000; i++))
是Bash中的算术扩展语法,这种语法通常使用在复杂的算术运算或者循环中,语法简单清晰,运行效率也较高。如果需要在循环中使用大量的算术运算,这种语法可能更合适。
seq 1 1000
则是一个单独的命令,可以生成一个数字序列,语法也相对简单。如果需要在循环中使用不规则的数字序列,比如只需要奇数或者偶数,或者指定一个步长,这种语法可能更方便。
{1..1000}
是Bash中的花括号扩展语法,可以快速生成数字序列。这种语法最大的优势在于其简洁性和易读性,可以在代码中快速生成简单的数字序列。但是需要注意的是,这种语法在其他Shell中可能不被支持。如果代码需要在其他Shell中运行,建议使用其他的循环语法。