当前位置:  操作系统/服务器>linux
本页文章导读:
    ▪diff与comm命令比较文件 找出新增内容      在项目中遇到一个奇怪的bug,是由一行简单代码引起的。 代码作用:比较两个UNIX文本文件,找出并打印文本2比文本1新增加的内容。 代码调用了diff命令,例如:   # temp1.txt文件内容 $> ca.........
    ▪Linux常用压缩解压命令(tar、zip与unzip)      一,tar命令 基本用法: 1,打包文件:tar -cvf ~/test.tar ~/test 2,打包并压缩文件:tar -zcvf ~/test.tar.gz ~/test 3,解包文件:先切换到要解包到的目录,然后执行:tar -xvf ~/test.tar 参数详解: -c, -.........
    ▪尚观linux笔记之sed命令      一,文本的操作 sed是一个“非交互式的”面向字符流的编辑器,awk是一种负责模式匹配的程序设计语言, 它的典型示例是将数据转换成格式化的报表。   二,sed awk命令的基本操作 例一.........

[1]diff与comm命令比较文件 找出新增内容
    来源: 互联网  发布时间: 2013-12-24

在项目中遇到一个奇怪的bug,是由一行简单代码引起的。
代码作用:比较两个UNIX文本文件,找出并打印文本2比文本1新增加的内容。

代码调用了diff命令,例如:
 

# temp1.txt文件内容
$> cat temp1.txt
20110224
20110225
20110228
20110301
20110302
# temp2.txt文件内容
$> cat temp2.txt
20110228
20110301
20110302
20110303
20110304
 

# diff命令输出结果
 

代码示例:
$> diff temp1.txt temp2.txt
1,2d0
< 20110224
< 20110225
5a4,5
> 20110303
> 20110304
# 只输出temp2.txt文件独有的内容
$> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g'
20110303
20110304
 

说明:输出结果去掉了两个文件的共同内容,只输出了temp2.txt的新增部分,和预想的结果一样。
 
但是,随着temp1.txt文件内容的增加,diff命令出现了不同预期的结果:
 

代码示例:
$> cat temp1.txt
20101216
20101217
20101220
20101221
20101223
20101224
20101227
20101228
20101229
20101230
20101231
20110103
20110104
20110105
20110106
20110107
20110110
20110111
20110112
20110113
20110114
20110117
20110118
20110119
20110120
20110121
20110124
20110125
20110126
20110127
20110128
20110131
20110201
20110202
20110203
20110204
20110207
20110208
20110209
20110210
20110211
20110214
20110215
20110216
20110217
20110218
20110221
20110222
20110223
20110224
20110225
20110228
20110301
20110302
20110303
$> cat temp2.txt
20110228
20110301
20110302
20110303
20110304
20110307
20110308
20110309
20110310
20110311
20110314
$> diff temp1.txt temp2.txt
1,55c1,11
< 20101216
< 20101217
< 20101220
< 20101221
< 20101223
< 20101224
< 20101227
< 20101228
< 20101229
< 20101230
< 20101231
< 20110103
< 20110104
< 20110105
< 20110106
< 20110107
< 20110110
< 20110111
< 20110112
< 20110113
< 20110114
< 20110117
< 20110118
< 20110119
< 20110120
< 20110121
< 20110124
< 20110125
< 20110126
< 20110127
< 20110128
< 20110131
< 20110201
< 20110202
< 20110203
< 20110204
< 20110207
< 20110208
< 20110209
< 20110210
< 20110211
< 20110214
< 20110215
< 20110216
< 20110217
< 20110218
< 20110221
< 20110222
< 20110223
< 20110224
< 20110225
< 20110228
< 20110301
< 20110302
< 20110303
---
> 20110228
> 20110301
> 20110302
> 20110303
> 20110304
> 20110307
> 20110308
> 20110309
> 20110310
> 20110311
> 20110314
$> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g'
20110228
20110301
20110302
20110303
20110304
20110307
20110308
20110309
20110310
20110311
20110314
 

可以看到,diff命令不但输出了temp2.txt文件的新增部分(20110304-20110314),也同时输出了两个文件的共同内容(20110228-20110303),从而导致了与预期不一致的结果。

查看diff命令的man手册发现,diff的作用是比较两个文件的内容,并输出两个文件之间的差异,产生一个能够将两个文件互相转换的列表,但这个列表并不能100%保证是最小集。

于是,以上例子中,可以看到diff给出了temp1.txt和temp2.txt文件的比较差异结果,但其中包含了两个文件的共同部分,因此与预期不一样。
 
解决方法:
用comm命令代替diff,例如:
 

代码示例:
$> comm -13 temp1.txt temp2.txt
20110304
20110307
20110308
20110309
20110310
20110311
20110314
 

comm命令用来比较两个文件,具体用法:
comm [-123] file1 file2
-1 过滤file1独有的内容
-2 过滤file2独有的内容
-3 过滤file1和file2重复的内容
 
备注:
diff的输出格式,主要有以下几种:
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
例如"1,2d0" "5a4,5" "1,55c1,11"等。
其中n1和n2指第一个文件的行数,n3和n4指第二个文件的行数。"a"代表add增加,"d"代表delete删除,"c"代表change整块变动。
有了diff的输出结果,可以使用patch命令将一个文件恢复成另一个,例如:
 

代码示例:
$> cat temp1.txt
20110224
20110225
20110228
20110301
20110302
$> cat temp2.txt
20110228
20110301
20110302
20110303
20110304
$> diff temp1.txt temp2.txt > temp.diff
$> cat temp.diff
1,2d0
< 20110224
< 20110225
5a4,5
> 20110303
> 20110304
# 使用temp.diff和temp1.txt恢复temp2文件
$> patch -i temp.diff -o temp2_restore.txt temp1.txt
Looks like a normal diff.
done
# 完成后temp2_restore和原temp2文件内容一致
$> cat temp2_restore.txt
20110228
20110301
20110302
20110303
20110304

    
[2]Linux常用压缩解压命令(tar、zip与unzip)
    来源: 互联网  发布时间: 2013-12-24

一,tar命令

基本用法:
1,打包文件:tar -cvf ~/test.tar ~/test
2,打包并压缩文件:tar -zcvf ~/test.tar.gz ~/test
3,解包文件:先切换到要解包到的目录,然后执行:tar -xvf ~/test.tar

参数详解:
-c, --create               创建一个新归档
-x, --extract, --get       从归档中解出文件
-t, --list                 列出归档内容
-A, --catenate, --concatenate   追加 tar 文件至归档
-f, --file=ARCHIVE         使用归档文件或 ARCHIVE 设备
-v, --verbose              详细地列出处理的文件
-z, --gzip, --gunzip, --ungzip   通过 gzip 过滤归档

二,zip和unzip
1,压缩:
zip -r filename.zip file1 file2 file3 /usr/work/school 
-r     将指定的目录下的所有子目录以及文件一起处理
2,解压:
将test.zip解压到用户目录:
unzip ~/test.zip -d ~/

参数:
-v 执行是时显示详细的信息。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-n 解压缩时不要覆盖原有的文件。
-q 执行时不显示任何信息。


    
[3]尚观linux笔记之sed命令
    来源: 互联网  发布时间: 2013-12-24

一,文本的操作
sed是一个“非交互式的”面向字符流的编辑器,awk是一种负责模式匹配的程序设计语言,
它的典型示例是将数据转换成格式化的报表。
 
二,sed awk命令的基本操作
例一:file1.txt
 

代码示例:
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA

用Massachusetts替换MA
 

代码示例:
$ sed's/MA/Massachusetts/' file1.txt

使用多重指令
 

代码示例:
$ sed's/ MA/, Massachusetts/ ; s/ PA/, Pennsylvania/' file1.txt
或:
$ sed-e 's/ MA/, Massachusetts/' -e 's/ PA/, Pennsylvania/'
file1.txt

脚本:sedsrc
 

代码示例:
s/MA/, Massachusetts/
s/PA/, Pennsylvania/
s/ CA/,California/
s/VA/, Virginia/
s/OK/, Oklahoma/
 
使用脚本文件
$ sed-f sedsrc file1.txt
 
保存输出
$ sed-f sedsrc file1.txt > newfile.txt
阻止输入行自动显示
$ sed-n 's/MA/Massachusetts/p' file1.txt
 
常见出错信息
‘’不匹配
s/src/dst/缺少最后的“/”

使用awk
 

代码示例:
使用脚本文件
awk-f script files
打印输入文件每行的第一个字段
$ awk'{ print $1 }' file1.txt
打印匹配这种模式的每一行
$ awk'/MA/' file1.txt
限制只输出每条记录的第一个字段
$ awk'/MA/ { print $1 }' file1.txt
改变分隔字符
$ awk-F, '/MA/ { print $1 }' file1.txt
使用多重命令,用“分号”隔开
$ awk-F, '{ print $1; print $2; print $3 }' file1.txt

常见出错信息
没有大括号{}将过程括起来
没用单引号’’将指令括起来
没有使用斜杠//slashes 将正则表达式括起来
 
OptionDescription
-f Filename of script follows.
-F Change field separator.
-vvar=value follows.
 
三,正则表达式 语法 Regular Expression
表达式(模式匹配)
算术表达式:
1+23*5 1+2*3 (1+2)*3
特定的模式:
ABCADC AEC … …
ababb abbb abbbb abbbb… …
一个正则表达式描述了一种模式或字符序列
正则表达式的匹配过程
 
元字符
. 匹配除换行符之外的任意单个字符,awk中可以匹配换行符
* 匹配任意一个(包括零个)在它前面的字符
[...]匹配方括号中的任意一个字符,^为否定匹配, -表示字符的范围
^ 作为正则表达式的第一个字符,匹配行的开始。在awk中可以嵌入换行符
$ 作为正则表达式的最后一个字符,匹配行的结尾。在awk中可以嵌入换行符
\{n,m\} 匹配n和m之间的任意次数, \{n\}匹配出现n次。\{n,\}匹配至少出
现n次
\ 转义字符
 
扩展元字符
ExtendedMetacharacters (egrep and awk)
+ 匹配前面的正则表达式的一次出现或多次出现
? 匹配前面的正则表达式的零次出现或一次出现
| 可以匹配前面的或后面的正则表达式(替代方案)
() 对正则表达式分组
{n,m} 匹配出现的n到m次数, {n}匹配出现n次。{n,}匹配至少出现n次,大多数awk都不支持,用于POSIX egrep和POSIX awk
 
编写正则表达式的3 个步骤:
1 知道要匹配的内容以及它如何出现在文本中。
2 编写一个模式来描述要匹配的内容
3 测试模式来查看它匹配的内容
 
模式匹配产生的结果:
Hits(命中)
这是我想匹配的行
 
Misses(未命中)
这是我不想匹配的行
 
Omissions(遗漏)
这是我不能匹配但想要匹配的行
 
Falsealarms(假警报)
这是我不想匹配的但却匹配了的行
 
字符类
 

[Ww]hat
\.H[12345]

字符的范围
 

[a-z]
[0-9]
[Cc]hapter[1-9]
[-+*/]
[0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]

排除字符类
 

[^0-9]

重复出现的字符
10
50
100
500
1000
5000
[15]0*
[15]00*

代码示例:
字符的跨度
* 与 \{n,m\}
电话号码的匹配
[0-9]\{3\}-[0-9]\{7,8\}

分组操作
compan(y|ies)
注意:大多数sed 和grep 不能对圆括号()进行匹配,但是在egrep 和
awk 所有版本都是可以的
 
四,编写sed 脚本
模式空间:
 

代码示例:
sed-e ‘s/pig/cow/’ -e ‘s/cow/horse/’

寻址上的全局透视(定址)
sed将命令应用于每个输入行,它可以指定零个、一个或两个地址。每个地址
都是一个描述模式、行号或者行寻址符号的正则表达式。
例file2.txt
.TS
Beijing,CN
.TE
 
Shanghai,CN
guangzhou,CN
shenyang,CN
$ sed'/Beijing/s/CN/China/' file2.txt

代码示例:
删除所有的行
d
只删除第一行
1d
使用寻址符号$,删除最后一行
$d
删除空行,正则表达式必须封闭在斜杠//当中
/^$/d
删除.TS 和.TE 标记的tbl 输入
/^\.TS/,/^\.TE/d
删除第五行到结尾所有的行
5,$d
混合使用行地址和模式地址
10
$ sed'1,/^$/d' file2.txt
删除除了那些行以外的行
1,5!d

分组命令
 

代码示例:
/^\.TS/,/^\.TE/{
s/CN/China/
s/Beijing/BJ/
}
sed'2,3s{/cn/china/;s/a/b/}'  file.txt 同一范围的两个替换可以用大括号括起来一起,中间加分号。

五,基本的sed 命令
sed 命令的语法
[address]command
行地址对于任何命令都是可选的,它可以是一个模式,或者由斜杠、行号或行寻址符号括住的正则表达式, 大多数sed命令能接受由逗号分隔的两个地址, 有些命令只接受单个行地址
命令还可以用大括号进行分组,第一个命令可以和大括号放在同一行,但是右大括号必须自己一行。
 
替换
[address ]s/pattern /replacement/flags
标志flags是:
n 可以是1-512,表示第n次出现的情况进行替换
g 全局更改
p 打印模式空间的内容
wfile 写入到一个文件file中
 
replacement部分用下列字符会有特殊含义:
&用正则表达式匹配的内容进行替换
\n 回调参数
 

代码示例:
$ cattest1
first:second
one:two
$ sed's/\(.*\):\(.*\)/\2:\1/' test1
second:first
two:one

删除
[address]d
删除模式空间的内容,同时改变脚本的控制流,执行这个命令后,在“空的”模式空间不再有命令执行。删除命令会导致读取新的输入行。


    
最新技术文章:
▪linux系统中的列出敏感用户的脚本代码
▪a10 config backup for aXAPI
▪一键备份gitolite服务器的Shell脚本
▪nagios 分发文件实现代码
▪阿里云云服务器Linux系统更新yum源Shell脚本
▪一个监控LINUX目录和文件变化的Shell脚本分享
▪Linux下实现SSH免密码登录和实现秘钥的管理、...
▪Shell正则表达式之grep、sed、awk实操笔记
▪3个备份系统文件并邮件发送的Shell脚本分享
▪CentOS 6.3下给PHP添加mssql扩展模块教程
▪监控网站是否可以正常打开的Shell脚本分享
▪shell脚本编程之if语句学习笔记
▪shell脚本编程之循环语句学习笔记
▪shell脚本编程之case语句学习笔记
▪Shell脚本实现的阳历转农历代码分享
▪Shell脚本实现复制文件到多台服务器的代码分...
▪Shell脚本实现批量下载网络图片代码分享
▪Shell脚本实现检测文件是否被修改过代码分享
▪Shell脚本数组用法小结
▪Shell脚本批量重命名文件后缀的3种实现
▪C语言实现的ls命令源码分享
▪Linux下查找后门程序 CentOS 查后门程序的shell脚...
▪Shell 函数参数
▪linux shell 自定义函数方法(定义、返回值、变...
▪Shell实现判断进程是否存在并重新启动脚本分...
▪Shell脚本break和continue命令简明教程
▪Shell脚本函数定义和函数参数
▪让代码整洁、过程清晰的BASH Shell编程技巧
▪shell常用重定向实例讲解
▪awk中RS、ORS、FS、OFS的区别和联系小结
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3