xml地图|网站地图|网站标签 [设为首页] [加入收藏]
用AutoHotkey实现Excel从表B提取匹配数据到表A,li
分类:操作系统

企业案例1:优化SSH配置(一键完成增加若干参数

在我们学习CentOS6系统优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件/etc/ssh/sshd_config加入下面5行文本。

Port 52113    #ssh服务端口
PermitRootLogin no    #不允许root远程登陆
PermitEmptyPasswords no    #不允许密码为空
UseDNS no
GSSAPIAuthentication no

当然我们可以使用vi/vim命令编辑这个文本,但是这样就比较麻烦,现在想用一条命令增加5行文本到第13行前?

[root@chengliang ~]# sed -i '13i Port 52113nPermitRootLogin nonPermitEmptyPasswords nonUseDNS nonGSSAPIAuthentication no' /etc/ssh/sshd_config

命令说明:题目要求在第13行前插入,那就需要使用命令13i。有同学做个题目时,是这样想的,在13行前,那不就是12行后吗,12a也是可以的。是的,这样也是没错的,这可以算是第二种方法。
最后插入的5行内容使用“n”就可以变成一行了。
上面还有一个没讲过的选项"-i",这个选项能够实际的修改文件内容,大家练习时可以去掉,防止改掉了配置文件。如果使用了-i,可以用备份文件还原。当然,在生产环境修改配置文件那就需要用-i选项了。
[root@chensiqi1 ~]# sed -n '13,17p' /etc/ssh/sshd_config
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

 

使用方法:
1、打开【ExcelGetFromB.exe】(如要打开示例则根据文字提示跳过步骤2)
2、打开【表A】和【表B】(如果打开2个以上Excel表,需要在【设置.ini】里输入【表B】的文件名)
3、选中【表A】第1个要搜索的单元格,按【F9】
4、按右下角提示依次点击【右表】相应列的任一【单元格】。
5、选好后选中任一【整列】即可。

 

一、前言

我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件等等。如果我们相对这些文件进行一些编辑查询等操作时,我们可能会想到一些vi,vim,cat,more等命令。但是这些命令效率不高,这就好比一块空地准备搭建房子,请了10个师傅拿着铁锹挖地基,花了一个月的时间才挖完,而另外一块空地则请了个挖土机,三下五除二就搞定了,这就是效率。而在linux中的“挖土机”有三种型号:顶配awk,中配sed,标配grep。使用这些工具,我们能够在达到同样效果的前提下节省大量的重复性工作,提高效率。

sed 是Stream Editor(字符流编辑器)的缩写,简称流编辑器。什么是流?大家可以想象以下流水线,sed就像一个车间一样,文件中的每行字符都是原料,运到sed车间,然后经过一系列的加工处理,最后从流水线下来就变成货物了。

编辑文件也是这样,以前我们修改一个配置文件,需要移动光标到某一行,然后添加点文字,然后又移动光标到另一行,注释点东西.......可能修改一个配置文件下来需要花费数十分钟,还有可能改错了配置文件,又得返工。这还是一个配置文件,如果数十个数百个呢?因此当你学会了sed命令,你会发现利用它处理文件中的一系列修改是很有用的。只要想到在大约100多个文件中,处理20个不同的编辑操作可以在几分钟之内完成,你就会知道sed的强大了。

 

说明:为表述方便,待填的表为【表A】,资料库的表称为【表B】。
该工具可以快捷地从【表B】中提取相关数据到【表A】,顺序和列可自定义。

在划分磁盘分区时,遇到错误“WARNING: Re-reading the partition table failed with error 22: Invalid argument” 如下所示:

我们想查看文件中的某些行,以前最常用的是cat或more或less命令等,但这些命令有些缺点,就是不能查看指定的行。而我们用了很久的sed命令就有了这个功能了。而且我们前面也说过使用sed比其他命令vim等读取速度更快!

“p”:输出指定内容,但默认会输出2次匹配的结果,因此使用-n选项取消默认输出,记忆方法:p的全拼是print,意思是打印。

按行查询

[root@chengliang zcl]# sed "2p" zcl.txt
101,chengliang,aa
102,alex,bb
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "2p" zcl.txt
102,alex,bb
[root@chengliang zcl]# 
命令说明:选项-n取消默认输出,只输出匹配的文本,大家只需要记住使用命令p必用选项-n。

[root@chengliang zcl]# sed -n "2,3p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 
命令说明:查看文件的第2行到3行,使用地址范围“2,3”。取行就用sed,最简单

[root@chengliang zcl]# sed -n "1~2p" zcl.txt
101,chengliang,aa
103,eric,cc
命令说明:打印文件的1,3,5行。~代表步长

[root@chengliang zcl]# sed -n "p" zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 
命令说明:不指定地址范围,默认打印全部内容。

按字符串查询

[root@chengliang zcl]# sed -n "/alex/p" zcl.txt    ==>命令说明:打印含CTO的行
102,alex,bb
[root@chengliang zcl]# 
[root@chengliang zcl]# sed -n "/alex/,/chengliang/p" zcl.txt
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -n "/alex/,/eric/p" zcl.txt    ==>命令说明:打印含alex的行到含eric的行
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

混合查询

[root@chengliang zcl]# sed -n "2, /cc/p" zcl.txt
102,alex,bb
103,eric,cc
命令说明:打印第2行到含cc的行。

[root@chengliang zcl]# sed -n "/cc/,2p" zcl.txt
103,eric,cc
[root@chengliang zcl]# 
命令说明:特殊情况,前两行没有匹配到cc,就向后匹配,如果匹配到cc就打印此行。所以这种混合地址不推荐使用。

 过滤多个字符

[root@chengliang zcl]# sed -rn "/alex|cc/p" zcl.txt
102,alex,bb
103,eric,cc
[root@chengliang zcl]# 

命令说明: 使用扩展正则“|”,为了不使用转义符号“”,因此使用-r选项开启扩展正则表达式模式

 

附件:

图片 1

三、命令执行流程

Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行....

一次一行的设计使得sed软件性能很高,sed在读取非常庞大的文件时不会出现卡顿的想象。大家都用过vi命令,用vi命令打开几十M或更大的文件,会发现有卡顿现象,这是因为 style="color: #ff0000;">vi命令打开文件是一次性将文件加载到内存,然后再打开,因此卡顿的时间长短就取决于从磁盘到内存的读取速度了。而且如果文件过大的话还会造成内存溢出现象。Sed软件就很好的避免了这种情况,打开速度非常快,执行速度也很快。

现有一个文件person.txt,共有五行文本,sed命令读入文件person.txt的第一行“101,chensiqi,CEO”,并将这行文本存入模式空间(sed软件在内存中的一个临时缓存,用于存放读取到的内容,比喻为工厂流水线的传送带。)

文件person.txt在模式空间的完整处理流程

  • 判断第1行是否是需要处理的行,如果不是要处理的行就重新从文件读取下一行,如果是要处理的行,则接着往下走。
  • 对模式空间的内容执行sed命令,比如a(追加),i(插入),s(替换)...
  • 将模式空间中经过sed命令处理后的内容输出到屏幕上,然后清空模式空间
  • 读取下一行文本,然后重新执行上面的流程,直到文件结束

图片 2

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

 

Sed软件有两个内置的存储空间:

  • 模式空间(pattern space):是sed软件从文本读取一行文本然后存入的缓冲区(这个缓冲区是在内存中的),然后使用sed命令操作模式空间的内容。
  • 保持空间(hold space):是sed软件另外一个缓冲区,用来存放临时数据,也是在内存中,但是模式空间和保持空间的用途是不一样的。Sed可以交换保持空间和模式空间的数据,但是不能在保持空间上执行普通的sed命令,也就是说我们可以在保持空间存储数据。

 

出现这个错误,是因为没有在有效的设备(valid device)上进行分区操作(太久没有玩这台测试服务器了,忘记当初如何划分存储,测试一个备份的过程急于需要磁盘空间,没有检查情况,就动手了),实际上这个分区类型为 Linux LVM。已经划给VolGroup00了。后续处理如下。

企业案例2:指定行修改配置文件

[root@chengliang zcl]# sed "3s#0#9#" zcl.txt
101,chengliang,aa
102,alex,bb
193,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

命令说明: 前面学习的例子在sed命令“s”前没有指定地址范围,因此默认是对所有行进行操作。 而这个案例要求只将第3行的0换成9,这里就用到了我们前面学过的地址范围知识,在sed命令“s”前加上“3”就代表对第3行进行替换

 

 

特殊符号&代表被替换的内容

这是一个特殊技巧,在适合的场景使用特别方便。下面用特殊符号“&”与分组替换一起使用,进行对比。

[root@chengliang zcl]# cat zcl.txt
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# sed -r 's#(.*),(.*),(.*)#& ----- 1 2 3#' zcl.txt 
101,chengliang,aa ----- 101 chengliang aa
102,alex,bb ----- 102 alex bb
103,eric,cc ----- 103 eric cc
104,laonanhai,dd ----- 104 laonanhai dd
[root@chengliang zcl]# 

上面命令的&符号代表每一行,即模型中‘s#目标内容#替换内容#g’的目标内容。

 

[root@DB-Server ~]# pvscan

  PV /dev/sda2   VG VolGroup00   lvm2 [465.66 GB / 413.94 GB free]

  Total: 1 [465.66 GB] / in use: 1 [465.66 GB] / in no VG: 0 [0   ]

[root@DB-Server ~]# lvscan

  ACTIVE            '/dev/VolGroup00/LogVol00' [45.97 GB] inherit

  ACTIVE            '/dev/VolGroup00/LogVol01' [5.75 GB] inherit

[root@DB-Server ~]# more /etc/fstab 

/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1

LABEL=/boot             /boot                   ext3    defaults        1 2

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

[root@DB-Server ~]# vgdisplay

  --- Volume group ---

  VG Name               VolGroup00

  System ID             

  Format                lvm2

  Metadata Areas        1

  Metadata Sequence No  3

  VG Access             read/write

  VG Status             resizable

  MAX LV                0

  Cur LV                2

  Open LV               2

  Max PV                0

  Cur PV                1

  Act PV                1

  VG Size               465.66 GB

  PE Size               32.00 MB

  Total PE              14901

  Alloc PE / Size       1655 / 51.72 GB

  Free  PE / Size       13246 / 413.94 GB

  VG UUID               EYKFmq-O1Ko-0z94-Os3P-AKfC-0bG9-9oTQDh

   

[root@DB-Server ~]# lvextend -L 80G /dev/VolGroup00/LogVol00

  Extending logical volume LogVol00 to 80.00 GB

  Logical volume LogVol00 successfully resized

[root@DB-Server ~]# resize2fs /dev/VolGroup00/LogVol00

resize2fs 1.39 (29-May-2006)

Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required

Performing an on-line resize of /dev/VolGroup00/LogVol00 to 20971520 (4k) blocks.

The filesystem on /dev/VolGroup00/LogVol00 is now 20971520 blocks long.

 

[root@DB-Server ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

                       78G   32G   42G  44% /

/dev/sda1              99M   13M   82M  14% /boot

tmpfs                 1.9G 1023M  916M  53% /dev/shm

/tmp/rhel-server-5.7-x86_64-dvd.iso

                      3.6G  3.6G     0 100% /mnt/cdrom

[root@DB-Server ~]# 

五、常用功能-增删改查

1、增

比如我们平时往配置文件写入几行文本,最常用的是vi或vim命令,但是这2个命令是一种交互式的命令,还需要我们在vi/vim编辑器界面输入字符串然后保存退出,操作有些繁琐但是还能用。但是当我们学会了Shell脚本后,我们就会发现在脚本中不能正常使用vi或vim命令,为什么呢?同学们请自行体验。

这里我们需要用到2个sed命令,分别是:

  • “a”:追加文本到指定行后,记忆方法:a的全拼是append,意思是追加。
  • “i“:插入文本到指定行前,记忆方法:i的全拼是insert,意思是插入。

在文件中增加一行文本,我们以前学过echo命令可以在文件的末尾追加文本,比较简单,但是我们还有其他的复杂需求,比如在第10行插入一行数字等等,这里就需要sed出马了。

[root@chengliang zcl]# sed "2a hahaha" zcl.txt
101,chengliang,aa
102,alex,bb
hahaha  #新增的那句
103,eric,cc
104,laonanhai,dd

图片 3

sed修改文件的同时进行备份

[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt
[root@chengliang zcl]# sed -i.bak "s#chengliang#Fuck#g" zcl.txt
[root@chengliang zcl]# ls
a  a.bak  ac  ae  ae.bak  afff  person.txt  test.txt  test_1  zcl.txt  zcl.txt.bak
[root@chengliang zcl]# cat zcl.txt
101,Fuck,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# cat zcl.txt.bak
101,chengliang,aa
102,alex,bb
103,eric,cc
104,laonanhai,dd
[root@chengliang zcl]# 

命令行说明: 在-i参数的后边加上.bak(.任意字符),sed会对文件进行先备份后修改

 

 

本文由澳门新葡亰手机版发布于操作系统,转载请注明出处:用AutoHotkey实现Excel从表B提取匹配数据到表A,li

上一篇:阿里云开发之OSS数据迁移,解决方案 下一篇:没有了
猜你喜欢
热门排行
精彩图文