编写巡检工具中一些shell基本技巧(持续更新)

来源:互联网 发布:财务报销流程软件 编辑:程序博客网 时间:2024/06/05 16:45

1.egrep用法

egrep常用语将打印结果中多个匹配项进行去除筛选,例如正常打印iostat结果


将打印结果的空格、百分号、以及第一行内容过滤掉,可以如下命令

iostat |egrep -v '%|Linux|^$'


其中^$是用于过滤空格


2.用root用户截取oracle打印结果

这里可以灵活运用EOF和su  -c

例如查看asm_disk一些信息

su grid -c "/usr/bin/sh" <<-EOF
     export ORACLE_SID=+ASM2
     export ORACLE_HOME=/app/grid/product/122
     echo "
           set linesize 1000;
           col path for a30;
           col failgroup for a10;
           select GROUP_NUMBER,DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,FAILGROUP,PATH from v\\\$asm_disk order by GROUP_NUMBER;"|/app/grid/product/122/bin/sqlplus -S '/ as sysasm'

EOF


这样好处可以在EOF内部将打印出来的结果进行过滤筛选,

su grid -c "/usr/bin/sh" <<-EOF
     export ORACLE_SID=$asm_sid
     export ORACLE_HOME=$ORACLE_HOME
     echo "
           set linesize 1000;
           col path for a30;
           col failgroup for a10;
           select GROUP_NUMBER,DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,FAILGROUP,PATH from v\\\$asm_disk order by GROUP_NUMBER;"|/app/grid/product/122/bin/sqlplus -S '/ as sysasm'|egrep -v '^$|--|GROUP_NUMBER|rows'|awk '{print "STATIC,,"\$1",",\$2",",\$3",",\$4",",\$5",",\$6",",\$7",",\$8}'
EOF

这样可以将之前的打印结果在EOF内部修改,达到你需要的输出结果的目的


3.如果查询多个oracle结果,可以将很多信息以参数的形式,赋值到一个变量中

para_value=$(su $ORACLE_ADMIN -c "/usr/bin/sh" <<-EOF
   export ORACLE_HOME=${ORACLE_HOME}
   export ORACLE_SID=${oracle_sid}
   export ORACLE_BASE=${ORACLE_BASE}
    
   #Check active sessions/total session  $1/$2
   echo "select count(*) from v\\\$session;"| ${ORACLE_HOME}/bin/sqlplus -S '/ as sysdba'|tail -n 2 | head -n 1;
   echo "select count(*) from v\\\$session where USERNAME is not null and STATUS='ACTIVE' group by status;"| ${ORACLE_HOME}/bin/sqlplus -S '/ as sysdba'|tail -n 2 | head -n 1;
   
   #Check SGA,PGA,UNDO in used (Unit:MB) $3/$4/$5
   echo "select TRUNC((sum(BYTES/1024/1024)),0) from V\\\$SGASTAT;"| ${ORACLE_HOME}/bin/sqlplus -S '/ as sysdba'|tail -n 2 | head -n 1;
   echo "select TRUNC(VALUE/1024/1024,0) from  V\\\$PGASTAT where NAME='total PGA inuse';"|${ORACLE_HOME}/bin/sqlplus -S '/ as sysdba'|tail -n 2 | head -n 1;
   echo "select TRUNC((sum(BYTES/1024/1024)),0) from dba_segments where tablespace_name= (select \
              upper(value) from v\\\$parameter where name = 'undo_tablespace');"| ${ORACLE_HOME}/bin/sqlplus -S '/ as sysdba'|tail -n 2 | head -n 1;

EOF

如上,我们将active sessions、total sessions、SGA、PGA等待赋值到para_vaule中,然后在通过para_vaule中的$1 $2...$n来一次性输出多个需要的结果

比如

total_sess=`echo $para_value | awk '{print \$1}'`;
   active_sess=`echo $para_value | awk '{print \$2}'`;
  
   #Calc SGA,PGA,UNDO in used (Unit:MB)
   sga_inused=`echo $para_value | awk '{print \$3}'`;
   pga_inused=`echo $para_value | awk '{print \$4}'`;
   undo_inused=`echo $para_value | awk '{print \$5}'`;


4.利用for循环查询多个结果,比如df-h中所有的文件系统

   for dd in `df -m | grep -v 'Mounted on' | awk '{print $1}'|grep '/'` 
   do
     lv_length=0;
     lv_length=`echo $dd|awk '{print length($1)}'`
     
     if [ $lv_length -le 20 ];then
       fs_total=`df -m $dd | tail -n 1 | awk '{print $2}'`
       fs_used=`df -m $dd | tail -n 1 | awk '{print $5}'`
     else
       fs_total=`df -m $dd | tail -n 1 | awk '{print $1}'`
       fs_used=`df -m $dd | tail -n 1 | awk '{print $4}'` 
     fi;
     mount_point=`df -m $dd | tail -n 1 |awk '{print $NF}'`
     echo 'STATIC,,'$dd,$fs_total,$fs_used,$mount_point;
   done;

阅读全文
1 0
原创粉丝点击