AWK:
 

 
  
  1. awk -F: '{c="";s=1;e=3;while(s<e){c=$s","c;s++}print c}' /etc/passwd 
很多人说awk不能打印几个连续的字段.我用while循环实现了一个.不过还是有点缺陷.
s=开始字段;e=结束字段
有更好的想法的朋友欢迎交流

 
 
  
  1. awk '{a[$1]++}END{print asort(a)}'  filename 
注意 asort()  函数,统计数组元素的个数
 
# more test.txt 
8889 032719041960000306288 18605688888
8890 032719040360000306388 15603938888
 

 
awk '{print $1,substr($2,0,8),$3}' test.txt

 

 

 

awk '/'"$IP"'/{print $1}' $tracert_file | grep -v "tracer"
awk 调用系统变量'"变量"'
利用shell作变量替换

 

 
 
[root@test-linux1 shell]# more 1
1:2:3
4:5:6

[root@test-linux1 shell]# awk 'BEGIN{FS=":";OFS="--"}{print $0}' 1
1:2:3
4:5:6
[root@test-linux1 shell]# awk 'BEGIN{FS=":";OFS="--"}$1=$1' 1         
1--2--3
4--5--6
 
$1=$1可以让原来的记录按照你重新设置的变量FS和OFS重新组合。


http://bbs.chinaunix.net/viewthread.php?tid=577044
awk 使用两个文件一起查数据
getline函数也不错:
http://xb9he.blogchina.com/xb9he/6373001.html

awk的变量:
$0           当前一整条记录
$1-$n        当前记录的第N字段
FILENAME     当前文件名
NF           当前记录的字段数目
NR           当前记录的编号(如果是多个文件就要叠加,下面有实例)
FNR          当前记录的编号(有多个文件,不叠加)
FS           记录的字段分割符(-F参数同作用)
OFS          输出内容的字段分隔符
RS           输入内容的记录分隔符
ORS          输出内容的记录分隔符
ARGC         命令行参数的个数
ARGIND       命令行中文件序号
ARGV         命令行参数数组


awk 中NR和FNR的区别
awk '{print NR,$0}' 1 2
[root@linux-test1 test]# awk '{print NR,$0}' haha.txt test.txt
1 1 a
2 2 b
3 3 d
4 4 c
5 5 e
6 6 f
7 a 2000
8 b 3000
9 c 1000
10 d 3400
11 e 1232
12 f 3213
NR:到此为止的记录数

awk '{print FNR,$0}' 1 2
[root@linux-test1 test]# awk '{print FNR,$0}' haha.txt test.txt
1 1 a
2 2 b
3 3 d
4 4 c
5 5 e
6 6 f
1 a 2000
2 b 3000
3 c 1000
4 d 3400
5 e 1232
6 f 3213
FNR:当前文件的记录数

awk -F'[()]'
awk 的分割符为“(”或者“)”,以前笨得只会用BEGIN。记住了。

awk -F: '{a[$7]++}END{for(i in a)print i,a[i]}' passwd
写个数组的例子,防止忘记

awk '{if($1 ~ /^132.*/ )print $0}' test.txt
如果$1是以132开头,那么打印出这行

awk一个常用的函数:
length(str)  返回str的字符个数;如果不带参数,返回当前记录的字符个数
int(num)     返回整数部分
index(str1,str2)  返回str2在str1中的位置
split(str,arr,del) 以del为分隔符,将str字符串拆分成数组放入到@arr中,返回元素个数
sprintf(fmt,args)  模仿C中的同名函数
substr(str,pos,len) 返回str中从pos开始长度为len个字符的字符串
tolower(str)        将所有大写字母变成小写
toupper(str)        将所有小写字母变成大写


打印记录的最后一个字段:
awk '{print $NF}' passwd

打印最后一行:
awk 'END{print}' passwd

打印最后三行:(如果再多要一些,就多加几个元素就可以了)
awk -F: 'BEGIN{OFS="\n"}{a[0]=a[1];a[1]=a[2];a[2]=$0}END{print a[0],a[1],a[2]}' passwd

打印最后三行的最后一个字段:
awk -F: 'BEGIN{OFS="\n"}{a[0]=a[1];a[1]=a[2];a[2]=$NF}END{print a[0],a[1],a[2]}' passwd
 
 
不打印最后一个字段:
awk -F: 'BEGIN{OFS=FS}{for(a=1;a<NF;a++)printf "%s"OFS,$a;print ""}' /etc/passwd

SED:

sed '/IP\|ADDR\|NETMASK/n'
sed 的多个条件


替换2,5行:
sed '2,5 c\           ## \是换车,也就是换行字符
asdjfl\
asdlfj\
asdf\
asdf' passwd

不打印第5行:
sed '5 !p' passwd  或者   sed '5 n;p' passwd

在行首插入一个字符:
sed 's/^/#/' passwd  或者  sed 's/^./#&/' passwd  ## 注意,不要少了&符号


关于sed的pattern区和hold区:
这两个概念,说实话,我看明白了两次(可能),但是不久就会忘记。原因是:1,概念我觉得比较难理解;2,不常用到(我现在实际还没有用到过。)3,几个指令太容易记混了

sed有两个缓冲区,所有命令都工作在Pattern区上,其中保留着sed刚读入的行。
另外一个Hold区就是用来临时存放Pattern区数据的。在把Pattern区上的数据放入Hold区之前,Hold区为空。

下面是5个关于Pattern区与Hold区之间交换数据的指令:
G  将一个换行和Hold区中的数据追加到Pattern区中数据之后
g  将Hold区的数据覆盖到Pattern区中,Pattern区中源数据全丢弃
H  将一个换行符和Pattern区中的数据追加到Hold区数据之后
h  将Pattern区中的数据覆盖到Hold区,Hold区中的源数据全丢弃
x  交换Pattern区和Hold区中的数据

直接修改文件内容:
sed -i.bak 's/^./#&/' a          ## -i这个知道,是直接编译文件的意思。但是后面再加一个.bak,意思就是保存一个源文件的副本,副本名是在原文件名后加上.bak后缀(.bak可以任意)

sed一次执行多个操作:
sed '/asldf/{s/a/A/;s/d/D/}' a.bak   或者使用 -e 参数,如下:
sed -e '/asldf/s/a/A/' -e '/asldf/s/d/D/' a.bak

修改后的操作另存为a.a文件:
sed '/asldf/s/a/A/w a.a' a.bak
 
sed把连续N行空白行合并成一行
 
 
  
  1. sed  '/^\s*$/{N;/^\s*$/D}' a 

字符大小写转换:
sed '1,3y/abc/ABC/' newfile
AvdAsC
BAvBdf
CfAedB
d
e
f
 

 

 

 

 

CODE:
var=abcd
sed:sed -n "/$var/p"   // awk: awk '/'"$var"'/'
num=2
sed: sed -n "${n}p"   //awk: awk 'NR=='"$var"''
#sed要用双引号,awk变量顺序单双$var双单

反之:sed/awk将变量传给shell可以用eval, 如

 

CODE:
eval $(awk 'BEGIN{print "a=ggg b=3"}')
然后
echo $a;echo $b
测试一下