【例2-1】使用od命令的例子。
$ od a.dat
0000000 046532 131400 004000 000000 020000 000153 016220 002000
0000020 000400 051571 071564 062555 020126 062562 071551 067556
0000040 020064 027071 030015 005044 075007 000016 017570 004630
0000060 020533 000514 036441 000000 000000 056011 000000 004000
0000100 000000 000000 000000 005000 000000 047105 002474 107510
0000120 072025 002035 007566 007152 062000
(最左列以十六進制形式指出數據在文件中的偏移量)
$ od -c a.dat
0000000 M Z ? \0 \b \0 \0 \0 \0 \0 k 034 220 004 \0
0000020 001 \0 S y s t e m V e r s i o n
0000040 4 . 9 0 \r \n $ z \a \0 016 037 x \t 230
0000060 ! [ 001 L = ! \0 \0 \0 \0 \ \t \0 \0 \b \0
0000100 \0 \0 \0 \0 \0 \0 \n \0 \0 \0 N E 005 < 217 H
0000120 t 025 004 035 017 v 016 j d
(從這裡能看到,文件中有System Version字符串)
$ od -x a.dat
0000000 4d5a b300 0800 0000 2000 006b 1c90 0400
0000020 0100 5379 7374 656d 2056 6572 7369 6f6e
0000040 2034 2e39 300d 0a24 7a07 000e 1f78 0998
0000060 215b 014c 3d21 0000 0000 5c09 0000 0800
0000100 0000 0000 0000 0a00 0000 4e45 053c 8f48
0000120 7415 041d 0f76 0e6a 6400
$ echo abcdABCD | od –x
0000000 6162 6364 4142 4344 0a00
$
【例2-2】使用head和tail命令的例子
$ head -15 ab.c
(顯示文件ab.c中前15行)
$ head -23 a.c b.c c.c | more
(顯示三個文件各自的前23行共顯示69行)
$ tail -20 liu.mail
(打印出文件尾部的20行,看看郵件尾部的發信者簽名)
$ netstat –s –p tcp | head -5
tcp:
5902873 packets sent
5118107 data packets (3423705271 bytes)
35445 data packets (18222213 bytes) retransmitted
329697 ack-only packets (35578 delayed)
【例2-3】使用tail命令實時顯示文件新追加的內容。
tail –f /usr/adm/pppd.log
【例2-4】使用wc命令的例子。
wc sum.c (1個文件)
wc x.c makefile stat.sh (多個文件)
以下是上機操作實例。
$ cat list.awk
(事先編輯好的awk程序文件,程序中含有三組“條件 {動作}”描述。其中:BEGIN的動作有三個,程序執行時,awk處理所有文本行之前,執行BEGIN指定的三個動作;處理完所有文本行之後,執行END指定的一個動作;最後一個程序塊,未指定任何條件,對所有文本行執行這個動作。在這段程序中使用了內置變量FILENAME和NR, $0)
BEGIN {
printf("=====================================\n")
printf("FILENAME %s\n", FILENAME)
printf("-------------------------------------\n")
}
END { printf("====================================\n") }
{ printf("%3d: %s\n", NR, $0) }
$ awk -f list.awk md5.c
=====================================
FILENAME md5.c
-------------------------------------
1:
2: #include "md5.h"
3:
4: /* forward declaration */
5: static void Transform ();
6:
7: /* F, G, H and I are basic MD5 functions */
8: #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
……
298: buf[2] += c;
299: buf[3] += d;
300: }
301:
====================================
【例2-12】使用sed命令的例子。
(1) tail -f pppd.log | sed 's/145\.37\.123\.26/QiaoXi/g'
sed的編輯命令有很多,這裡的s命令是“替換(substitute)”,三個斜線分割的第一部分是正則表達式145\.37\.123\.26,第二部分是替換字符串QiaoXi,最後的g是global flag,這一特征字符,使得s命令在一行中遇到多個模式描述的字符串時,都替換為QiaoXi,否則,僅替換一次。
上述命令中,sed將IP地址轉為一個名字。
(2) tail -f pppd.log | sed -f sed.script
其中sed.script文件內容如下:
s/145\.37\.123\.26/QiaoXi/g
s/102\.157\.23\.109/LiuYin/g
s/145\.37\.123\.57/DaTun/g
……
使用這樣的方法,定義一張IP地址/名字的對照表,sed可以將一些程序的輸出內容進行編輯替換,加工之後再顯示出來。
【例2-13】使用tr命令的例子。
(1) 將大寫UVX改寫為小寫uvx。
cat telnos | tr UVX uvx
(2) 可以使用[ ]指定一個集合。
cat report | tr '[a-z]' '[A-Z]'
將小寫字母改為大寫字母。
(3) 也可以使用\加三個八進制數字(類似C語言中描述字符常數的方法)表示一個字符。下面的命令將%改為換行符:
cat file1 | tr % '\012'
在第一章1.3.5節中介紹過UNIX和DOS文本文件的區別,下面的命令將按照二進制格式從DOS拷貝來的文件中多余的回車改為空格,回車的ASCII碼是八進制的015。
cat myap.c | tr '\015' ' ' > myap1.c
這幾個例子的命令中,注意不要漏掉必需的單引號。
【例2-14】 比較兩個不同版本的C語言源程序文件,找出文件的改動之處。
源程序文件f1.c被修改後的新版本源程序文件為f2.c,下面是UNIX下比較兩個文本文件f1.c和f2.c的結果。
$ cmp f1.c f2.c
f1.c f2.c differ: char 69, line 3
$ diff f1.c f2.c
3,5d2
< tmp->vm_mm = mm;
< mm->map_count++;
< tmp->vm_next = NULL;
260c257
< i = (i+1) * 8 * sizeof(long);
---
> i = i * 8 * sizeof(long);
528c525
< p->swappable = 1;
---
> p->swappable = 0;
548a546,547
> retval = p->pid;
> p->tgid = retval;