linuxshell 学习点滴
这是本人在学习 shell语言第二阶段,从CU上一些比较经典的实际问题的解决来加强记忆。转载请注明LUPA社区,不断更新中.........
1.每一行的字段个数不同,要求结果中只取出每行的最后一个字段,例:
分隔符为;
111;222;333
444;555;666;777
123;456
要求结果为:
333
777
456
-------------
awk -F; '{print $NF}' urfile
2.两个文件比较重复的问题
有2个存手机号码的文件1.txt和2.txt,我想把1.txt在2.txt中重复的号码去掉存成一个新文本3.txt
1.txt
13050176735
13304132423
13130315683
13304233351
13188288359
2.txt
13050176735
13304132423
13130315683
13304233351
13188288359
13050176828
-------------------------
cat 1.txt 2.txt|sort|uniq>3.txt
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-f Fields 忽略由 Fields 变量指定的字段数目。 如果 Fields 变量的值超过输入行中的字段数目, uniq 命令用空字符串进行比较。 这个标志和 -Fields 标志是等价的。
-u 仅显示不重复的行。
-s Characters 忽略由 Characters 变量指定的字符的数目。 如果 Characters变量的值超过输入行中的字符的数目, uniq 用空字符串进行比较。 如果同时指定 -f 和 -s 标志, uniq 命令忽略由 -sCharacters 标志指定的字符的数目,而从由 -f Fields 标志指定的字段后开始。 这个标志和 +Characters标志是等价的。
-Fields 忽略由 Fields 变量指定的字段数目。 这个标志和 -f Fields 标志是等价的。
+Characters 忽略由 Characters 变量指定的字符的数目。 如果同时指定 - Fields 和 +Characters标志, uniq 命令忽略由 +Characters 标志指定的字符数目,并从由 -Fields 标志指定的字段后开始。 这个标志和 -sCharacters 标志是等价的。
3.把2007:00:00:03转换为-----> 2007:00:00
现有这样一个文本,我想将最后的 冒号和数字部分
2007:00:00:03
2007:00:00:03
2007:12:00:02
2007:00:04:03
----------------
sed 's/\(.*\):../\1/'
4.何截取指定一个行区域
比如一个命令的输出如下
abc
。。。
。。。
asfsf
cba
现在我要截取abc与cba之间的内容
---------------------
sed '/abc/,/cba/p' $file
5.awk 匹配的问题
566 567 AppAdmn 1
566 568 UserAdmn 2
566 606 PC_SYD 0
566 607 608 kkk
566 608 PC_PER pio
566 609 SP_SYD 23l
608 610 SP_MEL ;ldsjf
566 611 SP_PER f09sd
如果我想查找 某一列含有指定匹配的东西,忽略其余的行含有的。这个要怎么写呢
比如我想查找 只有第二列含有 608的这条记录。
------------------------------------------------------awk '$2 ~608 {print $1,$2,$3,$4}' $file
6.现在有一个文件1.txt,内容如下:
|张三|boy|25|China|IT|
如何将竖线中的每个字段读出来,并且打印出如下内容:
Name:张三
性别:boy
年龄:25
国籍:中国
职业:IT
请问如何用shell脚本来实现???
————————————————————
awk 'BEGIN {FS="|";OFS="\n"} {print "Name: "$2,"性别: "$3,"年龄: "$4,"国籍: "$5,"职业: "$6}' example.txt
7.我有一批文件,想修改文件的创建时间和修改时间,但是又不想改成所有文件的创建时间和修改时间都一样?所以想在原文件的基础之上,把这两个时间都推迟一个月
-----------------------
touch -t $(date -d "1 month $(stat -c %y file)" +%Y%m%d%H%M.%S) file
8.oracle@bdb tmp]$ cat filename
12530999_20070301.txt
12530999_20070302.txt
12530999_20070303.txt
12530999_20070304.txt
12530999_20070305.txt
12530999_20070306.txt
12530999_20070307.txt
12530999_20070308.txt
12530999_20070309.txt
12530999_200703010.txt
我想在第一列前加入一些文本信息如"imp aaa/aaa file = ",以备做批处理使用。但不知道如何加入?使用SED好像只针对行的,而不是针对列的。
----------------------
awk '{print "imp aaa/aaa file = "$0}' example.txt
9.在shell中,如何将一个变量值写入到一个文件的开头?
————————————————————
sed -i "1s/^/$val\n/" file
10.在文件的最后一行末尾追加文本,而不是换到下一行写
————————————————————
sed -i '$s/$/string/' file
11.过滤成单行一个IP形式
(124.128.165.150[124.128.165.150])
(124.116.44.146[124.116.44.146])
(121.46.128.3[121.46.128.3])
(121.41.1.64[121.41.1.64])
(121.16.109.185[121.16.109.185]
过滤成124.128.165.150
--------------------
sed -n 's/.\(.*\)\[.*$/\1/p' filename
12.让该文本的前俩行合并成为一行
1112
16859.26
500000000001475,012608086,徐子初,4145600201224880010000,200611,42.66,42.66
--------------------
sed '1{N;s/\n/,/}'