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