grep -q 用于if 逻辑判断

今天突然发现grep -q 用于if 逻辑判断很好用。
-q 参数,本意是 Quiet; do not write anything to standard output.  Exit immediately with zero status if any match is found, even if an error was detected.   中文意思为,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。

小应用

# cat a.txt
nihao
nihaooo
hello

#  if  grep -q hello a.txt ; then echo yes;else echo no; fi
yes
# if grep -q word a.txt; then echo yes; else echo no; fi
no

postfix 安装脚本



其他postfix 相关文章  http://mylinux.5d6d.com/search.php?action=tag&name=postfix

shell 中 return 的应用

1、return命令会使得一个函数返回.我们在前面的一些函数的用法中已经注意到了这一点.return命令会返回一个单一的数字参数, 而这个数字参数在调用这个函数的脚本中是可见的.如果没有指定返回参数,return在默认情况下会返回上一次命令的返回代码。
2、了解一個概念:return value ﹗
我們在 shell 下跑的每一個 command 或 function ,在結束的時候都會傳回父行程一個值,稱為 return value 。
在 shell command line 中可用 $? 這個變量得到最"新"的一個 return value ,也就是剛結束的那個行程傳回的值。
Return Value(RV) 的取值為 0-255 之間,由程式(或 script)的作者自行定議:
* 若在 script 裡,用 exit RV 來指定其值,若沒指定,在結束時以最後一道命令之 RV 為值。
* 若在 function 裡,則用 return RV 來代替 exit RV 即可。
Return Value 的作用,是用來判斷行程的退出狀態(exit status),只有兩種:
* 0 的話為"真"( true )
* 非 0 的話為"假"( false )

舉個例子來說明好了:
假設當前目錄內有一份 my.file 的文件,而 no.file 是不存在的:
代码:
$ touch my.file
$ ls my.file
$ echo $?   # first echo
0
$ ls no.file
ls: no.file: No such file or directory
$ echo $?   # second echo
1
$ echo $?   # third echo
0

上例的第一個 echo 是關於 ls my.file 的 RV ,可得到 0 的值,因此為 true ﹔
第二個 echo 是關於 ls no.file 的 RV ,則得到非 0 的值,因此為 false ﹔
第三個 echo 是關於第二個 echo $? 的 RV ,為 0 的值,因此也為 true 。

請記住:每一個 command 在結束時都會送回 return value 的﹗不管你跑甚麼樣的命令...

awk中gsub函数的使用

awk 'gsub(/www/,"abc")' /etc/passwd  // passwd文件中把所有www替换为abc
awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd  // 替换$1中的www为abc


其他awk相关文章

awk 截取指定多个域为一行

for j in `seq 0 20`; do
        let x=100*$j
        let y=$x+1
        let z=$x+100
        for i in `seq $y $z` ; do
                awk  -v a=$i '{printf $a " "}' example.txt >>/tmp/test.txt
                echo " " >>/tmp/test.txt
        done
done



其他awk相关文章

shell 中 while循环的应用

#! /bin/sh
#打印10以内的加法表
i=1
while [ $i -le 9 ]
    do
       row=1
       colume=$i
       while [ $row -le $i ]
          do
            if((i==9))
             then
               echo -n "$row+$colume=$((row+colume)) "
            else
               echo -n "$row+$colume=$((row+colume)) "
            fi
            row=$(expr $row + 1)
            colume=$(expr $colume - 1)
          done
       echo
       ((i=$i+1))
done

预防cc攻击脚本

#! /bin/bash
N=350
while :; do
        tail -n 500 access.log |awk '{print $5}'|sort |uniq -c |sort -n|tail -n1 >/tmp/cc.log
        n=`awk '{print $1}' /tmp/cc.log`
        dom=`awk '{print $2}' /tmp/cc.log`
        if [ $n -gt $N ] ; then
                tail -n 500 access.log| grep $dom |awk '{print $1}'|sort -n |uniq |grep -v '192.168.' |xargs -n1 -i{} iptables -I INPUT -s {} -j DROP
        fi
        sleep 10   // 上边的500和这里的10是对应的,该服务器每秒钟产生的日志大约为50个
done

档案目录管理--split

说明:
  
  将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案,其档名依序为 PREFIXaa, PREFIXab...;PREFIX 预设值为 `x'。若没有 INPUT 档或为 `-',则从标准输入读进资料。
  
  选项:
  
  -b, --bytes=SIZE
  
  SIZE 值为每一输出档案的大小,单位为 byte。
  -C, --line-bytes=SIZE
  
  每一输出档中,单行的最大 byte 数。
  -l, --lines=NUMBER
  
  NUMBER 值为每一输出档的列数大小。
  -NUMBER
  
  与 -l NUMBER 相同。
  --verbose
  
  于每个输出档被开启前,列印出侦错资讯到标准错误输出。
  --help
  
  显示辅助资讯然后离开。
  --version
  
  列出版本资讯然后离开。
  SIZE 可加入单位: b 代表 512, k 代表 1K, m 代表 1 Meg。
  
  范例:
  
  PostgresSQL 大型数据库备份与回存:
  
  因 Postgres 允许表格大过你系统档案的最大容量,所以要将表格 dump 到单一的档案可能会有问题,使用 split 来进行档案分割。
  
   % pg_dump dbname | split -b 1m - filename.dump.
  
  重新载入
  
   % createdb dbname
  % cat filename.dump.* | pgsql dbname

用shell 打印乘法口诀

#! /bin/bash

for i in `seq 1 9`; do
        for j in `seq 1 $i`; do
                echo -n  "${j}x${i}=$(($i*$j))\t"
        done
        echo
done
结果为:
1x1=1
1x2=2   2x2=4
1x3=3   2x3=6   3x3=9
1x4=4   2x4=8   3x4=12  4x4=16
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

把一个文件多行连接成一行

a=`cat file`;echo $a
awk '{printf("%s ",$0)}' file   // %s 后记得要有一空格,否则出来就是完全连在一起的,中间连空格都没有
cat file |xargs

判断IP是否正确的shell 脚本

#! /bin/bash

checkip() {
        if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ; then
                a=`echo $1 | awk -F. '{print $1}'`
                b=`echo $1 | awk -F. '{print $2}'`
                c=`echo $1 | awk -F. '{print $3}'`
                d=`echo $1 | awk -F. '{print $4}'`

                for n in $a $b $c $d; do
                        if [ $n -ge 255 ] || [ $n -le 0 ]; then
                                echo 'bad ip(2)!'
                                return 2
                        fi
                done
        else
                echo 'bad ip(1)!'
                return 1
        fi
}

echo -n "Please input the ip:"
read  ip
checkip  $ip

监测kswapd0 进程

#! /bin/bash
C=5
while :; do
        c=`top -bn1 |awk '/kswapd0/ {print $9}'`
        if [ "$c" -gt "$C" ] ; then
                date >/tmp/mon_kswap.log
                top -bn1 >>/tmp/mon_kswap.log
                ps aux >>/tmp/mon_kswap.log
                mail -s web-wowo [email protected] </tmp/mon_kswap.log
                sleep 60
        fi
        sleep 5

done

awk 计算1到100的和

awk  'BEGIN { for(i=1; i<=100; i++) sum+=i; print sum}'

其他关于awk相关文章

把文件的奇数行和偶数行连接成一行

1. 首先要把文件连接成一行,具体方法请看上篇文章,实现方式为:
a=`cat  file`; echo $a >file1   或者   cat file |xargs >file1
2. wc -l file  // 记录下这个数值,假如说是100
3.  for i in `seq 1 2 100`; do let k=$i+1; awk '{print $"'$i'""   "$"'$k'"}'  file2  ; done  // 这里有必要解释一下,awk 中的符号用的有点乱,其中print 后边是$,其后紧跟一个双引号,然后是一个单引号,接着是$i,其后是单引号,双引号,再后边是双引号空格双引号(双引号空格双引号这是一部分,因为要写成 “奇数行 空格  偶数行”的格式),后边又是$双引号单引号$k单引号双引号

sed删除某关键字的下一行到最后一行

[root@test200 ~]# cat test
a
b
c
d
e
f
[root@test200 ~]# sed '/c/{p;:a;N;$!ba;d}' test
a
b
c

定义一个标签a,匹配c,然后N把下一行加到模式空间里,匹配最后一行时,才退出标签循环,然后命令d,把这个模式空间里的内容全部清除。

if 匹配"c"
:a
追加下一行
if 不匹配"$"
goto a
最后退出循环,d命令删除。

更多关于sed的文章