linux常用技巧收集

牛人博客

1、删除大量文件

要在Linux下删除海量文件的情况,需要删除数十万个文件。这个是之前的程序写的日志,增长很快,而且没什么用。这个时候,我们常用的删除命令rm -fr * 就不好用了,因为要等待的时间太长。所以必须要采取一些非常手段。我们可以使用rsync的--delete-before参数来实现快速删除大量文件。步骤如下:

  • 建立一个空的文件夹:
mkdir /tmp/test  
  • 用rsync删除目标目录:
rsync --delete-before -a -H -v --progress --stats /tmp/test/ log/

选项说明:
--delete-before 接收者在传输之前进行删除操作
--progress 在传输时显示传输过程
--a 归档模式,表示以递归方式传输文件,并保持所有文件属性
--H 保持硬连接的文件
--v 详细输出模式
--stats 给出某些文件的传输状态

这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。
注意: 在执行该操作之前请确认对应目录下的文件是否有用!!!

2、文件排序

  • 以文件大小递增
#ls-lR|grep^-|sort-nr-k5|more
  • 以文件大小递减
#ls-l|grep^-|sort-nr-k5|more

3、重定向

输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式:

20180226151961097213544.png

输出:

标准输出 && 错误输出 符号:">"
20180226151961114587261.png

输入 符号:"<"
20180226151961120739037.png

效果:

20180226151961126618072.png

  • 如果我们要将正确信息和错误信息同时写入怎么办?
    答案是 : &> (此命令就是将正确和错误的信息全部保存)

4、统计某服务占用内存

  • 一句话脚本
ps aux |grep -v grep| grep progress_name |sort -nrk4 |awk '{print $4}'|awk '{sum+=$1} END {print "Sum = ", sum}'
  • 使用“/proc”文件
#!/bin/bash
#统计进程所占内存
pid=`ps aux |grep -v grep |grep $1 |awk '{print $2}'`
sum=0
for i in $pid;do
  num=`grep Pss /proc/$i/smaps 2>/dev/null |awk '{total+=$2};END {print total}'`
  #echo "pid is $i"
  if [ ! -z $num ];then
    sum=$[sum+$num]
    #测试用
    #echo "num is $num"
    #echo "sum is $sum"
  fi
done
#单位转换——转化为GB(默认为kb)
tot=`echo "$sum" |awk '{printf ("%.2f\n",$1/1024/1024)}'`
echo "tot is $tot"
#注:注释掉的“echo”行为脚本调试时使用。  

注: 该脚本使用方法,例“sh sum.sh progress_name” (假设脚本名称为sum.sh,process_name为进程名)。
除法运算(保留小数): http://www.mamicode.com/info-detail-1187091.html
补充:

5、安人集团协作基础技能清单

https://github.com/OpenMindClub/Share/wiki/IdxCooperateBasicSkill

6、 检查cron计划——chkcrontab

用于检查加入到“/etc/cron.d/”的任务计划文件是否正确执行。

[root@host3 ~]# pip install chkcrontab  

[root@host3 ~]# chkcrontab /etc/cron.d/sysstat 
Checking correctness of sysstat

硬盘监测shell脚本

这个脚本是依赖dell提供的megacli工具写的,使用了一段时间,但是之后就使用了falcon的硬件监控工具,包括主板,风扇,硬盘,raid卡等比这个方便。

#!/bin/sh
allhosts="host01 "
log_dir=/home/chuyun_sys/disklog/
log_name=_raid_disk_monitor
logtime=$(date +%Y%m%d --date='1 days ago')
fix=.log
for i in $allhosts;do
host=`ssh $i "hostname"`
echo  "Checking RAID status on $host" >> $log_dir$logtime$log_name$fix
echo -e "\033[31m $host \033[0m"
echo "$host" >>$log_dir$logtime$log_name$fix
RAID_Contrller=`ssh $i 'megacli -AdpAllInfo -aALL |grep "Product Name" | cut -d: -f2'`
echo "Controller : $RAID_Contrller" >> $log_dir$logtime$log_name$fix
Online_disk_num=`ssh $i 'megacli  -PDList -aALL | grep Online | wc -l'`
echo "Totall number of Physical disks online : $Online_disk_num" >> $log_dir$logtime$log_name$fix
Degrade_disk=`ssh $i 'megacli -AdpAllInfo -a0 |grep "Degrade"'`
echo  "$Degrade_disk"  >>$log_dir$logtime$log_name$fix
Failed_disk=`ssh $i 'megacli -AdpAllInfo -a0 |grep "Failed Disks"'`
echo "$Failed_disk " >>$log_dir$logtime$log_name$fix
#Failed_disk_num=`ssh $i 'echo $Failed_disk |cut -d " " -f4'`
done

awk针对某列进行匹配

使用场景:查看文件大小时可能需要通过排序时输出更清晰,如果文件名不涉及G、M等单位字符在执行du -h命令后直接使用grep G就能把文件大小在G级别的文件筛选出来,但是有些自生文件名往往是无规则的,其中就会包含有G、M等字符,这样一来grep就力不从心了,所以使用awk针对指定列进行匹配输出,如下:

#只匹配文件大小在G级别的文件并针对第一列以数字大小顺序排序
du -ch |awk '$1~/G/' |sort -nk1 

20180423152447445668813.png

猜你喜欢

转载自my.oschina.net/u/3497124/blog/1624003