linux重定向:在shell脚本中固定周期执行命令并将输出信息自动输出到文件中保存

0. Shell脚本中,变量名和等号之间不能有空格!!!

1. 按固定周期执行命令: 

while true
do
   cmd(shell 命令)
   sleep x(x为秒数)
done
n=0;
while(($n<=100));
do 
top -n 1;
n=$((n + 1));
sleep 10;
done

2.获取当前时间

date "+%Y-%m-%d %H:%M:%S"
按照%Y-%m-%d %H:%M:%S格式输出当前时间

输出如下所示

3. 重定向

sh batchjob.sh 2>&1 | tee mylog.log

  其中sh batchjob.sh:表示要执行的shell脚本;0,1,2:在linux分别表示标准输入、标准输出和标准错误信息输出。

tee命令

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

输入输出重定向之:'<' and '>'

  '<' and '>'分别用来支持linux中的输入输出重定向,其中'<'支持输入重定向,'>'支持输出重定向。

扫描二维码关注公众号,回复: 5541761 查看本文章
  •  '<':重定向输入

    sh test.sh < hadoop-hadoop-jobtracker-brix-00.out,将hadoop-hadoop-jobtracker-brix-00.out的内容作为test.sh的输入

  •  '>':将内容全局覆盖式的加入文件,相当于删除该文件并重新建立该文件,再写入的效果

        ls * > test.txt ,将ls * 的所有信息输出到文件test.txt中

  •  '>!':如果存在则覆盖
  • '>&':执行时屏幕上所产生的任何信息写入指定的文件中
  • '>>':追加到文件中
  • '>>&':屏幕上的信息追加到文件中

标准输入输出

  在 Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的 std 表示 standard)。在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。下面我们举例来说明如何使用他们,特别是标准输出和标准错误输出。

4. 定义和使用变量

outputfilename=`date '+%Y%m%d%H%M%S'`.csv //定义变量
ls >> ${outputfilename} //使用变量

5. echo显示信息

#!/bin/bash
 
echo "write to file." //在标准输出显示数据
 
echo "iput your name:"
read y_name //从标准输入读取内容
 
echo "Hello,${y_name}" > f_users.bat //使用了变量,使用了重定向

 

 

6. shell脚本中执行命令

  • 每个命令之间用;隔开

说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。

  • 每个命令之间用&&隔开

说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
例如:cat /etc/redhat-release && yum -y update && yum list | grep installed > installed.txt  三个命令

  • 每个命令之间用 || 隔开

说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。

7. shell脚本中在后台执行命令nohup和 >/dev/null 2>&1

  • nohup表示永久运行。&表示后台运行

在应用Unix/Linux时,我们一般想让某个程序在后台运行,该命令的一般形式为:nohup command &。在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

  • >/dev/null 2>&1

/dev/null 代表空设备文件,> 代表重定向到哪里,>/dev/null 2>&1就是不输出任何信息到终端,说白了就是不显示任何信息。
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

nohup ./mqnamesrv >/home/cxb/mqnamesrv.out 2>&1 & 

即标准输出到mqnamesrv.out中,接着,标准错误输出重定向等同于标准输出,输出到同一文件中。

8. 在shell中执行命令,并将执行的结果输出到文件

#!/bin/sh

cmd=`ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'`

datetime=$(date '+%Y-%m-%d %H:%M:%S')

aaa=${cmd}

FILE="/alidata/logs/"$(date '+%Y-%m-%d')"_log.txt"

echo $datetime >> $FILE //将命令datetime运行的结果输出到文件
echo $aaa >> $FILE //将命令aaa运行的结果输出到文件
echo "$aaa" >> $FILE //将字符串aaa输出到文件
echo aaa >>$FILE //将字符串aaa输出到文件
echo "------------------------------------" >> $FILE

ps是执行的命令 使用 ` 符号(Esc下面那个)扩起来 .

FILE.txt 是写入的文件. 没有规定目录会创建文件到当前目录

echo "$aaa"   是输出到文件的时候保持格式.  echo $aaa 则内容为一行
9. Linux—shell中$、$(( ))、$( )、``与${ }的区别

$( ) 与 ` ` (反引号,不是单引号) 在 bash shell 中都是用来做命令替换用的。

[root@localhost ~]# echo today is $(date "+%Y-%m-%d")
today is 2017-11-07
[root@localhost ~]# echo today is `date "+%Y-%m-%d"`
today is 2017-11-07

$var与${var}是用于变量替换的,一般情况下是没有区别的,但是用${ }会比较精确的界定变量名称的范围。

[root@localhost ~]# A=Linux
[root@localhost ~]# echo $AB    #表示变量AB

[root@localhost ~]# echo ${A}B    #表示变量A后连接着B
LinuxB

10. 小结

  • 后台符号 &一定要放在整个命令最后
  • 重定向>,>>一定紧跟着重定向文件
  • 如果是 文件输出 1 stdout,2 stderr 要重定向到别的文件,也是紧跟>,>>符号。
  • 如果想让stderr也跟 stdout一样输出到文件,使用 /usr/local/bin/cmd >file 2>&1,同 /usr/local/bin/cmd 1>file 2>&1 是一样的意思。

11. 将批量命令执行的结果输出到日志中

#!/bin/bash
set -xv
exec 1>mylog 2>&1
free
df -h
pwd

第二行是打开模式开关。 -v:显示shell所读取的输入值。-x:执行指令后,会先显示该指令及所下的参数

第三行 exec命令用于调用并执行指令的命令。

exec命令通常用在shell脚本程序中,可以调用其他的命令;1> mylog  是将标准输出重定向到mylog文件中;2>&1 是将标准错误定向到标准输入,一起定向到mylog中,也就是说,标准输入和标准输出都会到mylog文件中
执行上面的脚本后,就会将后面三条命令free, df -h, pwd命令的执行结果全部生产到mylog文件中。

猜你喜欢

转载自blog.csdn.net/jinking01/article/details/85316837
今日推荐