目录

1、shell在文本第一行和最后一行添加字符串 

2、shell删除指定时间前的文件

3、Shell脚本 实现简单分割字符串

4、Shell脚本 8种字符串截取方法总结

5、shell清空文件内容

6、Shell 脚本等待上一行执行完成再执行下一行

方法1:

方法2:sleep

方法3:

7、Shell脚本统计文件行数的n种方法


1、shell在文本第一行和最后一行添加字符串 

sed -i '1i\添加的内容' file #这是在第一行前添加字符串 
sed -i '$i\添加的内容' file #这是在最后一行行前添加字符串 
sed -i '$a\添加的内容' file #这是在最后一行行后添加字符串

用sed命令在行首或行尾添加字符的命令有以下几种:

假设处理的文本为test.file

linux echo 追加到第一行_sed

在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

运行结果如下图:

linux echo 追加到第一行_linux echo 追加到第一行_02

几点说明:

1."^"代表行首,"$"代表行尾

2.'s/$/&TAIL/g'中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了


2、shell删除指定时间前的文件

需要配合find和rm两个命令完成

显示20分钟前的文件:

find /home/prestat/bills/test -type f -mmin +20 -exec ls -l {} \;

删除20分钟前的文件:

find /home/prestat/bills/test -type f -mmin +20 -exec rm {} \;

#查找30天以前的log文件

find /data/ -mtime +30 -name "*.log"

#查找30天以内的log文件

find /data/ -mtime -30 -name "*.log"

#查找第30天的log文件

find /data/ -mtime 30 -name "*.log"

#查找30分钟以前修改的log文件;

find /data/ -mmin  +30 -name "*.log"


3、Shell脚本 实现简单分割字符串

我们有这样一个字符串:

info='abcd;efgh'

现在想获取abcd和efgh,我们可以简单地用cut工具来获取:

fstr=`echo $info | cut -d \; -f 1`
abcd
sstr=`echo $info | cut -d \; -f 2`
efgh

 这里主要是用了cut工具的-d和-f参数:

-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;

关于cut工具其他参数可参考这里:cut命令

4、Shell脚本 8种字符串截取方法总结

假设有变量 var=http://www.aaa.com/123.htm.

1. # 号截取,删除左边字符,保留右边字符。

echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm

2. ## 号截取,删除左边字符,保留右边字符。

echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/

结果是 123.htm

3. %号截取,删除右边字符,保留左边字符

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符

结果是:http://www.aaa.com

4. %% 号截取,删除右边字符,保留左边字符

echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

5. 从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

6. 从左边第几个字符开始,一直到结束。

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

7. 从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123

8. 从右边第几个字符开始,一直到结束。

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:123.htm

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

5、shell清空文件内容


6、Shell 脚本等待上一行执行完成再执行下一行

方法1:

假设command 1执行需要1s,command 2执行需要视当前资源占用率花费10s~30s不等,command 3执行需要1s,则实现的代码如下:

#!/bin/sh
command 1
output=`command 2`
command 3

方法2:sleep

顺序执行(12秒执行完)

#!/bin/bash
date
for i in `seq 1 6`
do
{
 echo "sleep 2"
 sleep 2
}
done
date

并发执行并等待执行完成(2秒执行完)

#!/bin/bash
date
for i in `seq 1 6`
do
{
 echo "sleep 2"
 sleep 2
}&
done
wait #等待执行完成
date
#!/bin/bash
for ((i=0;i<5;i++))
do
sleep 3;echo a
done

#运行需要15秒。


#!/bin/bash
for ((i=0;i<5;i++))
do
{
sleep 3;echo a
} &
done
wait

#打开5个子进程并行,运行只需要3秒。

方法3:

  • 若有for循环 在循环体之后使用wait sleep
#!/bin/bash

  source ~/.bashrc

  fun(){

  echo "fun is begin.timeNum:$timeNum"

  local timeNum=$1

  sleep $timeNum &

 

  wait #这个只等待wait前面sleep

  echo "fun is end.timeNum:$timeNum"

  }

7、Shell脚本统计文件行数的n种方法

方法一

awk '{print NR}' test1.sh|tail -n1

如图所示:

linux echo 追加到第一行_linux echo 追加到第一行_03

方法二

awk 'END{print NR}' test1.sh
如图所示:

linux echo 追加到第一行_linux echo 追加到第一行_04

方法三

grep -n "" test1.sh|awk -F: '{print '}|tail -n1

如图所示:

linux echo 追加到第一行_linux echo 追加到第一行_05

方法四

sed -n '$=' test1.sh

如图所示:

linux echo 追加到第一行_字符串_06

方法五

wc -l test1.sh

如图所示:

linux echo 追加到第一行_字符串_07

方法六

#cat test1.sh |wc -l

如图所示

linux echo 追加到第一行_Shell_08