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的文章

cut 截取

-c list 指定剪切字符数。
-f field 指定剪切域数。
-d 指定与空格和t a b键不同的域分隔符。
- c用来指定剪切范围,如下所示:
- c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
-c1-50 剪切前5 0个字符。
-f 格式与- c相同。
-f 1,5 剪切第1域,第5域。
- f 1,10-12 剪切第1域,第1 0域到第1 2域。

例子:
cut -d: -f1  /etc/passwd  //以“:”为分隔符,截取passwd中第一列
cut -d: -f1,5   /etc/passwd  //截取第一列和第五列

linux lsof 命令

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接 和硬件。所以如传输控制协议 (tcp) 和用户数据报协议 (udp) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因 为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof使用
lsof输出信息含义
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
command    pid      user   fd      type     device     size       node      name
init       1         root cwd      dir       3,3       1024       2         /
init       1         root rtd      dir       3,3       1024       2         /
init       1         root txt      reg       3,3       38432      1763452 /sbin/init
init       1         root mem      reg       3,3       106114     1091620 /lib/libdl-2.6.so
init       1         root mem      reg       3,3       7560696    1091614 /lib/libc-2.6.so
init       1         root mem      reg       3,3       79460      1091669 /lib/libselinux.so.1
init       1         root mem      reg       3,3       223280     1091668 /lib/libsepol.so.1
init       1         root mem      reg       3,3       564136     1091607 /lib/ld-2.6.so
init       1         root 10u      fifo      0,15                  1309     /dev/initctl
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
command:进程的名称
pid:进程标识符
user:进程所有者
fd:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
type:文件类型,如dir、reg等
device:指定磁盘的名称
size:文件的大小
node:索引节点(文件在磁盘上的标识)
name:打开文件的确切名称
其中fd 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。
txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用
程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该
文件被打开并处于读取/写入模式,而不是只读 &reg; 或只写 (w) 模式。同时还有大写 的w 表示该应用程序具有对整个文件的写
锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,
分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 fd 都是从 3 开始。
与 fd 列相比,type 列则比较直观。文件和目录分别称为 reg 和 dir。而chr 和 blk,分别表示字符和块设备;
或者 unix、fifo 和 ipv4,分别表示 unix 域套接字、先进先出 (fifo) 队列和网际协议 (ip) 套接字。
lsof常用参数
lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。
例如,linux限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某
个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。lsof语法格式是:
lsof [options] filename
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string   显示command列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /dir/ 显示目录下被进程打开的文件
lsof +d /dir/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d fd 显示指定文件描述符的进程
lsof -n 不将ip转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
           46 --> ipv4 or ipv6
           protocol --> tcp or udp
           hostname --> internet host name
           hostaddr --> ipv4地址
           service --> /etc/service中的 service name (可以不只一个)
           port --> 端口号 (可以不只一个)
例如: 查看22端口现在运行的情况
# lsof -i :22
command pid user   fd   type device size node name
sshd    1409 root    3u ipv6   5678       tcp *:ssh (listen)
查看所属root用户进程所打开的文件类型为txt的文件:
# lsof -a -u root -d txt
command    pid user fd      type device    size    node name
init       1    root txt       reg    3,3   38432 1763452 /sbin/init
mingetty 1632 root txt       reg    3,3   14366 1763337 /sbin/mingetty
mingetty 1633 root txt       reg    3,3   14366 1763337 /sbin/mingetty
mingetty 1634 root txt       reg    3,3   14366 1763337 /sbin/mingetty
mingetty 1635 root txt       reg    3,3   14366 1763337 /sbin/mingetty
mingetty 1636 root txt       reg    3,3   14366 1763337 /sbin/mingetty
mingetty 1637 root txt       reg    3,3   14366 1763337 /sbin/mingetty
kdm        1638 root txt       reg    3,3 132548 1428194 /usr/bin/kdm
x          1670 root txt       reg    3,3 1716396 1428336 /usr/bin/xorg
kdm        1671 root txt       reg    3,3 132548 1428194 /usr/bin/kdm
startkde 2427 root txt       reg    3,3 645408 1544195 /bin/bash
... ...

用Shell编程,判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下。

如题:
答案如下:
#!/bin/bash
read -p "Input a filename : " filename
if [ -b "$filename" -o -c "$filename" ]
then
       echo "$filename is a device file" && cp $filename /dev/ &
else
       echo "$filename is not a device file" && exit 1
fi

用脚本关闭linux不用的服务

#! /bin/bash

services=`chkconfig --list|awk '{print $1}'`
for ser in $services
do
if [ "$ser" == "network" ] || [ "$ser" == "syslog" ] || [ "$ser" == "sshd" ] || \
[ "$ser" == "crond" ] || [ "$ser" == "atd" ] || [ "$ser" == "irqbalance" ] || \
[ "$ser" == "microcode_ctl" ] || [ "$ser" == "sendmail" ] ;
then
chkconfig --leve 3 "$ser" on
else
chkconfig "$ser" off
fi
done
echo "The unavaliable service has been shutdown successfully!"
sleep 5
init 6