Chinaunix首页 | 论坛 | 博客
  • 博客访问: 441235
  • 博文数量: 90
  • 博客积分: 20016
  • 博客等级: 上将
  • 技术积分: 1035
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-31 15:24
文章分类

全部博文(90)

文章存档

2011年(9)

2010年(80)

2006年(1)

分类:

2010-04-15 12:47:51

 

1)将数据文件中的每个词的第一个字母变成大写
echo 'welcome to ' |  awk '{gsub(/,/," & ")}{for(i=1;i<=NF;i++)if($i!~/^[^a-z]/)printf toupper(substr($i,0,1))substr($i,2,length($i))" ";else printf substr($i,0,1)toupper(substr($i,2,1))substr($i,3,length($i))" ";printf "\n"}'
2)如何删除所有重复行,一行不留,不能排序
文件a.txt
111
333
444
111
444
555
666
666
444
666
777
222
如何删除所有重复行,一行不留,就是只留333,555,222,777 行, 要求是不能先排序,直接删除。
awk '{a[$0]++}END{for(x in a)if(a[x]==1)print x}' o

3)
如何用awk打印出$3后面所有的域。比如说一共有$1~$9九个域,比如说我就想打印$3~$9
 awk ‘{for(i=3;i<=NF;i++)printf $i""}{printf "\n"}' file
awk 'NR>=31&&NR<=35'
awk 'NR>=3&&NR<=9'
 
4)同时取出两个变量的问题
现我有一个文件名为 ip.txt
内容如下 :
220.165.155.0   云南省临沧市 电信
222.220.207.0   云南省玉溪市 电信lsls
122.229.54.0   浙江省 电信
125.120.66.0   浙江省杭州市 电信
61.174.147.0   浙江省杭州市 电信
60.184.20.0   浙江省湖州市 电信
125.123.155.0   浙江省嘉兴市 电信
220.188.89.0   浙江省金华市 电信
60.182.174.0   浙江省金华市 电信
122.242.117.0   浙江省金华市 电信
60.178.55.0   浙江省宁波市 电信
125.114.117.0   浙江省宁波市 电信
61.130.77.0   浙江省衢州市 电信
125.106.22.0   浙江省衢州市 电信
60.187.178.0   浙江省绍兴市 电信
60.183.69.0   浙江省绍兴市 电信
220.185.146.0   浙江省台州市 电信
125.127.190.0   浙江省台州市 电信
218.73.146.0   浙江省温州市 电信
60.181.9.0   浙江省温州市 电信
125.109.19.0   浙江省温州市 电信
222.183.81.0   重庆市 电信(大渡口区)
222.183.18.0   重庆市 电信(高新区)
将它存为SHELL的两个变量,
IP=222.183.18.0
CITY= 重庆市 电信(高新区)
再进行PING动作
echo $IP
  ping -c $CITY

while read ip city
do
echo $ip;
ping -c $city
done < ip.txt

5)提取URL地址。
cat htm |grep -Eo '*.jpeg'
 
6)匹配符合条件的下一行
awk ‘/匹配行的关键字/&&条件 {print;getline;pring}' file

7)自动补齐
22160
22160
2210
2210
2210
22160
2210
22140
22160
22120
22140
2300
2344
 
sed -r 's/^([0-9]{4})$/\10/'

[root@mail-djh root]# more iiiii
.3
.4
1.5
[root@mail-djh root]# sed -r 's/^(\.)/0\1/' iiiii
0.3
0.4
1.5
 sed 's/^.\w/0&/g' iiiii
 sed -r 's/(\.)$/\1rpm/' install.log
 
 
8)生成序列
bash 3.0
for i in {a..z};do for j in {a..z};do echo $i$j;done;done

9)如何回显的同时重定向一个文件
ls | tee -a test.log
 
10) 特殊排序
[root@mail-djh root]# more a
MAY10
MAY11
MAY7
MAY8
[root@mail-djh root]# sort +0.3n  a
MAY7
MAY8
MAY10
MAY11

11)查看一个进程是什么时间运行的,运行了多长时间
ps -eo comm,etime  |grep syslogd | awk '{print $2}'
 
 
12)匹配ip地址
64 bytes from 119.75.213.50: icmp_seq=1 ttl=56 time=39.5 ms
64 bytes from 119.75.213.50: icmp_seq=2 ttl=56 time=39.3 ms
64 bytes from bg-in-f99.google.com (203.208.37.99): icmp_seq=1 ttl=240 time=40.5 ms
64 bytes from bg-in-f99.google.com (203.208.37.99): icmp_seq=2 ttl=240 time=43.2 ms

grep -Eo '\<([0-9]{1,3}\.){3}[0-9]{1,3}'

今天有一朋友问我怎么提取IP地址
有文本如下
192.168.1.1
555.21331.321.31
1.1.1.1
13.12.123.142
188.321.32.21
199.78.2.1
333.321.321.321
123.321.43.21
123.123.123.123
要求只提示IP地址  其实我感觉这题还是考的是正则表达式
向各位前辈学习 明天再来看答案

awk -F'.' '{if($1<255 && $2<255 && $3<255 && $4<255)print $0}' urfile
13)
现有两个文件,
FILE1 是人员代号与账号对应表,相对固定,如
JL1088        01100025587
JL1291        00460031396
JL1115        01100044273
JL1114        01100044265
JL1132        01100044455
JL1130        01100044430
JL1128        01100044406
JL1123        01100044356
JL1121        01100044331
JL1223        01100176146
JL1118        01100044307
FILE2 是人员姓名、人员代号(关键字,无重复)、金额,变动较大,如
张三        JL1088        180       
李四        JL1114        1174.55       
王五哥        JL1115        1252.82       
赵六郎        JL1116        1245.7       
齐七        JL1118        958.16       
韩八        JL1119        1344       
张三        JL1120        230       
秦丰        JL1121        230       
吴某        JL1122        280       
朱名        JL1123        280       
黄记        JL1128        913.17       
陈居正        JL1130        180       
宋小玉        JL1223        280       
程英俊        JL1291        230       
现要根据 FILE2 的第二列,从 FILE1 抽取该条记录的第二列账号内容,再填到 FILE2 的最后一列,结果如
张三        JL1088        180        01100025587
李四        JL1114        1174.55        01100044265
王五哥        JL1115        1252.82        01100044273
赵六郎        JL1116        1245.7                                 #在文件一中找不到该记录,此位置为空
齐七        JL1118        958.16        01100044307
韩八        JL1119        1344        ……
张三        JL1120        230        ……
秦丰        JL1121        230       
吴某        JL1122        280       
朱名        JL1123        280       
黄记        JL1128        913.17       
陈居正        JL1130        180       
宋小玉        JL1223        280       
程英俊        JL1291        230       
请教该怎样实现?先谢过了!
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$2]}' file1 file2
 
两个文件内关键词的匹配

a文件中有下列数据
98
87
76
75
……
b文件中有
lyl 76
csh 88
zz  99
opz 77
yy  75
……
要求从a文件读入各行与b文件比对 如该条记录 择最终输出相应的的关键词

lyl
yy
 
 
awk 'NR==FNR{a[$1]=$1}NR>FNR&&a[$2]{print $1}' a b
 

有两个文件,a.txt和b.txt
cat a.txt
1  100
2  200
3  300
cat b.txt
1  aaa
2  bbb
3  ccc
1  aaa
2  bbb
3  ccc
打算将两文件合并为:
1  100  aaa
2  200  bbb
3  300  ccc
1  100  aaa
2  200  bbb
3  300  ccc
不是这种形式:
1  100  aaa
1  100  aaa
2  200  bbb
2  200  bbb
3  300  ccc
3  300  ccc

awk 'NR==FNR{a[$1]=$2}NR>FNR{print $1,a[$1],$2}' a.txt b.txt
14)nmap中检索出ip和mac

forward:~# nmap -sP 192.168.9.0/24
Starting Nmap 4.62 ( ) at 2009-05-14 20:48 CST
Host 192.168.9.1 appears to be up.
MAC Address: 00:06:29:73:8B:F7 (IBM)
Host 192.168.9.2 appears to be up.
MAC Address: 00:1A:64:6D:06:B5 (IBM)
Host 192.168.9.3 appears to be up.
MAC Address: 00:1A:64:6D:1B:C3 (IBM)
Host 192.168.9.4 appears to be up.
MAC Address: 00:19:D1:32:BF:CE (Intel)
Host 192.168.9.7 appears to be up.
MAC Address: 00:22:15:85:E2:A6 (Unknown)
Host forward.cyjt.com.cn (192.168.9.9) appears to be up.
Host 192.168.9.10 appears to be up.
MAC Address: 00:40:05:43:02:6D (ANI Communications)
Host 192.168.9.79 appears to be up.
MAC Address: 00:22:15:8E:CC:77 (Unknown)
Host 192.168.9.94 appears to be up.
MAC Address: 00:1E:68:35:64:9E (Quanta Computer)
Host 192.168.9.115 appears to be up.
nmap -sP 192.168.1.0/24 | grep -B 1 "MAC" | sed '/--/d' | awk '{if(NR%2==1){print $2}if(NR%2==0){print $3}}' | xargs -n2
 
 
 
15)符合行加标记

aa   b  cd   fdf   g
a   s   dc   fv  gg
ff   cd  ee   rr  ss
 
...
如何做到判断每一行中如果包含 cd字符  则 在该行尾加一个 * 的标记
 
sed '/cd/s/$/*/' file
 

16)sort 排序  最大的数字在最前面

sort -rn  file

17) 比较两列的字母 ,第一排字母要比第二排字母顺序高。
A B
A C
A D
B E
B A
D A
E B
 
 awk '$2"#"$1 in a{next}{a[$1"#"$2]=1}1' file
 

18)如何将AWK的值传给管道?

lsof -i :22 |grep "\-" |awk '(NR == 2){print $2 }' | xargs kill -9
kill -9 `lsof -i :22 |grep "\-" |awk '(NR == 2){print $2 }'`
lsof -i :22 |awk '/-/&&(NR == 2){print "kill -9 "$2 }' |sh

19)for循环100次
for((i=0;i<=100;i++));do echo $i;done

20)awk 取反

awk 如何不输出第n和第m列(域)
如:
aa  bb  cc  dd  ee
ff  gg  hh  ii  jj
kk ll   xx  yy  zz
我不要第三列和第五列。。
awk '{$3=$5="";print}' 5
 
21)awk 语法加入引号

件格式为这样子的,
4.36.125.0        4.36.127.255        美国        坦帕大学
大概有30多万这样的记录,请问怎么才能装成sql文件导入到数据库呢?
有个高手教我用
awk '{print "insert into TbName(f1,f2,f3,f4) values("$1,","$2,","$3,","$4");"}'  filename.txt >good.sql
不过这样只能实现
insert into ipaddr(StartIP,EndIP,Country,Local) values(0.0.0.0 ,0.255.255.255 ,IANA ,CZ88.NET);
我要将引号加进去实现
insert into ipaddr(StartIP,EndIP,Country,Local) values(‘0.0.0.0’ ,‘0.255.255.255’ ,‘IANA’ ,‘CZ88.NET’);
这样我就可以直接导入mysql了
,请问应该怎么写?
awk '{print "insert into TbName(f1,f2,f3,f4) values(\047"$1"\047,\047"$2"\047,\047"$3"\047,\047"$4"\047);"}'  filename.txt > good.sql
awk -v v="'" '{print "insert into TbName(f1,f2,f3,f4) values("v$1v,","v$2v,","v$3v,","v$4v");"}' filename.txt > good.sql
 

22)统计一个文件中字符出现的次数

有一个文件,如下,用shell怎么能统计出每个数字出现的次数?谢谢:)
1,2,3,4
1,2
2,4,6,7,8
2,3,6,9
5,7,3
 
debian:~# awk -F "," '{for (i=1;i<=NF;i++)a[$i]++}END{for (i in a) print a[i]"times",i}' aa
2times 1
4times 2
3times 3
2times 4
1times 5
2times 6
2times 7
1times 8
1times 9
 
23)截取行中的字符

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[TEST]word_for_test1[\TEST]bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc[TEST]word_for_test2[\TEST]dddddddddddddddddddddddddddddddddd[TEST]word_for_test3[\TEST]
 
上面的字段,我需要截取[TEST]word_for_test1\2\3\....[\TEST]这些字段。即最后的结果应该像下面这样
[TEST]word_for_test1[\TEST]
[TEST]word_for_test2[\TEST]
[TEST]word_for_test3[\TEST]

grep -oE '\[TEST\]word_for_test[0-9]\[\\TEST\]'  i
 
24)运行程序自动输入参数运行
有一个程序a,如果手工执行a后,会有一个提示输入y后继续运行程序的操作。
我如何用一个shell来实现调用该程序,并自动输入一个y后,让a自动运行起来?

yes|sh a.sh
echo y | test.sh
 
25)shell相加
1+2+3 ...加到30 shell怎么写?
for((i=1;i<=30;i++));do
((sum+=i))
done
echo $sum
 
加入break???
i=0
while ((i<100));do
((i++))
((sum+=i))
if [ "$i" == 30 ];then
echo $sum
 
26)把三列变成两列
one two three
four five six
seven eight nine
变成
one two
three four
five six
seven eight
nine
 

cat 3 |xargs -n2
one two
three four
five six
seven eight
nine

27) 显示匹配的字符
[root@mail-djh root]# more i
a:5/29/2009:
b:12/29/2009:
c:5/28/2009:
d:5/27/2009:
[root@mail-djh root]# grep -Eo "[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}" i
5/29/2009
12/29/2009
5/28/2009
5/27/2009
[root@mail-
 
 
 
28) top 显示所以进程
top -b -n 4

29)一个文件有多个相同的字符串,只想替换一个
我的文件test内容如下:
aaaaa
bbbb
cccc
Enable=false
dddd
eeee
ffff
Enable=false
nnnn
mmmm
我只想替换第一个Enable=false为Enable=true,第二个Enable=false不改变,

sed -i '0,/Enable=false/{s/Enable=false/Enable=true/}' file
 

30)99乘法运算
for i in {1..9};do for j in {1..9};do echo ${i}x${j}=$((i*j));done;done
31)显示文件的数字执行权限
stat -c "%n %a" install.log
 
32)排列时间顺序
cat file.txt
1034         7:26
1025         7:27
1101         7:32
1006         7:45
1012         7:46
1028         7:49
1029         17:49
1051         7:51
1029         7:57
1039         21:57
1042         7:59
1008         8:01
1052         8:05
1005         8:12
我想使得$2按照时间排序,成为以下形式。
1034    7:26
1025    7:27
1101    7:32
1006    7:45
1012    7:46
1028    7:49
1051    7:51
1029    7:57
1042    7:59
1008    8:01
1052    8:05
1005    8:12
1029    17:49
1039    21:57

 sed -e 's/:/./g' ii | sort -k 2n | sed -e 's/\./:/g'
 

33)去掉''之间的数据字符
aaaaa  bbbb   'adfasdf' xxxxxxxx'dddddddddddd'ppppppppppppppp'mmm'kkkkkkkkkkkkk
需求去除的内容为:'adfasdf'  、'dddddddddddd' 、 'mmm'
就是在各 ''  之间的内容。

去掉''之间的数据字符
sed "s/'[^']*'//g"

34)awk引用变量
比如:
awk '$1 == "words" {print $2}' file
如果word换成一个变量,该怎样写?
 
awk '$1 == "'$words'" {print $2}' file  双单单双
 
35)列变成行
NAME                     Null?   Type
----------------------- ---------- ----------------------
aaa                        Not null VARCHAR2(40)
bbb                        Not null VARCHAR2(40)
ccc                         Not null VARCHAR2(40)
ddd                        Not null VARCHAR2(40)
想提取出NAME到变量中,就是变量name="aaa bbb ccc ddd"
请问用什么方法能实现啊,awk还是sed,请高手详细说下,谢谢
name=$(awk 'NR>2{print $1}' file)
name1=$(awk 'NR>2{print $2}' file)
36)对比两个目录下面的文件
现在有2个目录a和b
需要比较两个目录内的文件,需要找出其中一目录有而另外一个目录里没有的文件,并且删除。
文件名不是完全相同的,类似这种:
a:
xixi_.zip xxx_.zip ddd_.zip
b:
xixi_T.bak xxx_T.bak fff_T.bak
现在要找出其中一个有而另一个没有的文件出来。
一时没有思路。请大家启发一下

for i in `ls a`
do
if [ find b -name $i -type f ]
then echo "$i is exist"
else rm -rf b/$i
fi
done
 
要这个:
[Copy to clipboard] [ - ]CODE:
$ diff -r a b|sed -n '/^Only in /{s///;s/: /!/;s/\.[^.]*$/!&/;p}'|awk -F ! '{a[$2]++;b[$2]="rm -rf "$1"/"$2 $3}END{for(i in a) if (a[i]==1) print b[i]}'
正确后再删除:
[Copy to clipboard] [ - ]CODE:
$ diff -r a b|sed -n '/^Only in /{s///;s/: /!/;s/\.[^.]*$/!&/;p}'|awk -F ! '{a[$2]++;b[$2]="rm -rf "$1"/"$2 $3}END{for(i in a) if (a[i]==1) print b[i]}'|sh
 
diff -r a b|sed -n '/^Only in \([^:]*\): /s//rm -rf \1\//p'|sh

37)  read 变量是不显示输入的字符

read -p "Password:" -s passwd
Password:zj@zj:~$ echo $passwd
123456

-s就像我们输passwd的时候,没有回显,但是程序是认识的
 
 
38)删除一列的最后一个字符。
sed -e 's/.$//g' i
 
39)列变成行
echo 'cc vv bb' | tr ' ' '\n'
awk 'BEGIN{OFS=" ";ORS=" "}{print $1,$2}' io
[root@mail-djh root]# more io
data/
templates/
languages/
vote/data/
link/
search/data/
special/
uploadfile/2009/0510/
spider/rules/
[root@mail-djh root]# awk '{printf $0}' io
data/ templates/ languages/ vote/data/ link/ search/data/ special/ uploadfile/2009/0510/ spider/rules/[root@mail-djh root]#

40) 打印一个文件的最后一行
awk 'END{print}'  urfile
41)显示文件的最后一个域
echo a.1.b.2.c.3 | awk -F. '{print $NF}'
42)
Wget地址中能否使用通配符
wget -r -nd -np -A 'language-pack-zh_9.04*.deb'
 
43请问如何在文本中定位最后一个关键字的
一个文件中循环出现一段文字。例如:
###################
#sample
######################
1.
2
3
###################
#sample
######################
1.
2
3
4
5
6
7
每部分行数可能不一样但是都是以#sample开始的
我想找到最后一部分,然后从#sample开始的进行搜索 |grep -i error
请教如何得到最后这部分内容呢?

44)sed 引用变量
 sed -ne ''"$a"',$p' u1

awk -v RS="\n#sample\n" 'END{print}' URFILE

45)
下面的一些CVS中相同文件的各个版本号有所不同,有什么好的方法来提取这些文件的最新版本吗?比如下面的文件需要提取出来的是:
======================
/andy/data/CVS/aa.1.0
/andy/data/CVS/aa.1.1
/andy/data/CVS/aa.1.2
/andy/data/CVS/aa.1.3
/andy/data/CVS/aa.1.4
/andy/data/CVS/aa.2.0
/andy/data/CVS/bb.1.0
/andy/data/CVS/bb.1.1
/andy/data/CVS/bb.1.2
/andy/data/CVS/cc.1.3
/andy/data/CVS/cc.1.4
/andy/data/CVS/cc.1.5
/andy/data/CVS/dd.1.5
/andy/data/CVS/dd.1.6
/andy/data/CVS/dd.1.7
======================
需要预期的结果是这样的:
/andy/data/CVS/aa.2.0
/andy/data/CVS/bb.1.2
/andy/data/CVS/cc.1.5
/andy/data/CVS/dd.1.7

高手指点指点怎样才能实现呢?

sort cvs.txt | gawk 'BEGIN{FS="."}{newline=$1; a[NR]=$0; if(newline!=oldline) { print a[NR-1]; oldline=newline}}END{print a[NR]}'
sort -r f | awk '{a=substr($1,1,18);if(!s[a]) s[a]=$0}END{for(i in s) print s[i]}'
sed 's/\./\t/' f | sort -r | awk '{if(!s[$1]) s[$1]=$1"."$2}END{for(i in s) print s[i]}'
 

46)判断奇偶数
(($((number%2))==0))&&echo even ||echo odd
echo 2%2|bc
0
echo 10%3|bc
1
echo 21%3|bc
0
 
47)奇数行偶数行操作
我有一个文本文件,没隔一行就有一行乱码,如何用script作到隔行删除呢?
 
 
cat filename|awk '{if ( NR % 2==1)print $0}'
 
多谢啦!
如果要删的是奇数行呢? 就是删除1,3,5,7......行?
多谢!
 
 
借版主的一用
cat filename|awk '{if ( NR % 2==0)print $0}'
 
再说一句,由于awk缺省打印$0,所以上述答案中的$0可以省略
删除奇数行
cat filename | awk '{if(NR % 2==0) print}'
删除偶数行
cat filename | awk '{if(NR % 2==1) print}'

_
删除奇数行
awk 'NR % 2==0' filename
删除偶数行
awk 'NR % 2==1' filename

 
 
引用sed1line
奇:sed 'n;d'
偶:sed '1d;n;d' file
 

48)有以下格式的内容,请问应该如何筛选?,就去除part_b列的重复值,但是要对应part_a
part_a,part_b
aaa,111
aaa,111
aaa,222
aaa,333
aaa,333
bbb,444
bbb,555
bbb,555
bbb,555
......
筛选后的结果为:
part_a,part_b
aaa,111
aaa,222
aaa,333
bbb,444
bbb,555
 
uniq filename

49)已经文件a 格式如下:
QUOTE:
111
222
333
文件b格式如下:
QUOTE:
aa
bb
cc
如何通过shell ,将文件a,b 合并成
如下文件格式
QUOTE:
111   aa
111   bb
111   cc
222   aa
222   bb
222   cc
333   aa
333   bb
333   cc
#!/bin/bash
for i in `cat a`
do
        for j in `cat b`
        do
        echo $i $j
        done
done
阅读(8017) | 评论(2) | 转发(0) |
0

上一篇:heartbeat基于nfs的双机

下一篇:openldap 优化

给主人留下些什么吧!~~

hongbin09262010-06-21 13:19:17

好厉害啊

安何2010-05-06 20:54:29