本节主要内容:
vim高级替换技巧
1,替换变量
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。
例子:
1)、将 data1 data2 修改为 data2 data1
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1
2)、将 Doe, John 修改为 John Doe
:%s/\(\w\+\), \(\w\+\)/\2 \1/
2,利用函数式替换
用法:
:s/替换字符串/\=函数式
说明:
1)、函数式可以有多个,返回值可以用字符串连接符.连接起来,如line(".")返回匹配行号(:help line() ),submatch(n)可以引用\1、\2的内容,其中submatch(0)引用匹配的整个内容;
2)、函数式也可以是字符串常量,用双引号引起来。函数式也可以是任意表达式,需要用小括号引起来,如(3+2*6);
3)、函数式还可以是寄存器中的内容,通过"@寄存器名"访问,如@a(不需要加引号,但是还是需要用.来连接);
例子:
将下列8行的data0依次变成data0~7(前面的数字是行号)
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
如果安装有perl的话,我以前一般都是借助perl来完成这件事情:
:r !perl -n -le "if(s/^(double\s+data)\d;/$1$k;/){ $k++; print $_; }" %:p
其中%:p表示包含完整路径的文件名
现在只用vim我们就可以完成这样的事情:
首先将光标移到125行(line(".")返回当前匹配行的行号,line("'a")返回mark a的行号):
ma
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'a")+1).submatch(2)/g
再或者
首先将光标移到125行(line("'V7j
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'
3,匹配的开始与结束
\zs和\ze可以用于替换操作中指明替换的开始与结束,如上例中可以以更短的操作来实现:
ma
:%s#^double\s\+data\zs\d\ze#\=(line(".")-line("'a")+1)#g
另外,还可以使用vim表达式来实现上述功能:
:let n=0 | g/^double\s\+data\zs\d/s//\=n/ | let n+=1
其中 ·| 用来分割不用的命令;
·g 在匹配后面模式的行中执行指定的ex命令
·\zs 指明匹配由此开始
·s//\=n 对匹配模式进行替换,匹配模式为空,表示以上一次匹配成功的模式,
并且指明替换是一个表达式;
4,高级递增替换
把下面几句放到 _vimrc
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
以下问题,可以按如下的方法解决:
:let I=-1 | %s/^ double\s\+data\zs\d\ze/\=INC(1)/
另外,还可以生成数字序列,例如生成1~100间隔为5的数字序列:
:let I=0 | ‘a,’b s/^/\=INC(5)/
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
一、批量用户添加流程;
批量添中用户流程是通过newusers 导入一个严格按照/etc/passwd 的书写格式来书写内容的文件来完成添加用户。
然后通过chpasswd 导入用户密码文件来完成批量更新用户密码的过程;
1、newusers 成批添加用户的工具;
newusers 后面直接跟一个文件;文件格式和/etc/passwd 的格式相同;
用户名1:x:UID:GID:用户说明:用户的家目录:所用SHELL
举例:
win01:x:521:521::/home/win01:/sbin/nologin
......
关于SHELL类型,查看主机上所有SHELL ,可以通过chsh 来查看;
/bin/sh
/bin/bash
/sbin/nologin
/bin/ksh
/bin/tcsh
/bin/csh
/bin/zsh
其中除了/sbin/nologin ,其它类型的SHELL 都能登录系统;
nologin大多是虚拟用户用的SHELL,这样即便它是系统用户,也没有无登录系统的权限;
如果想添加这类用户,将其SHELL 设置成/sbin/nologin即可。
关于用户名、UID、GID及用户的家目录,可以参考如下的文章:
linux下查看用户及用户组的命令举例
有关linux用户和用户组管理的知识详解
实例学习Linux下新增与删除用户组
Linux用户与用户组详细教程
linux中的set uid,set gid,sticky bit详解
有关linux文件及目录的suid/guid和t属性
2、chpasswd 批量更新用户口令工具;
chpasswd < 文件
但文件的内容并不是没有约定的,必须以下面的格式来书写,并且不能有空行;
用户名1:口令1
用户名2:口令2
举例:
win01:654321
... ...
二、批量添加用户实例;
1、首先,创建用户文件和密码文件;
要创建包含新用户的文件userfile.txt;
另一个是为新添加的用户设置密码的userpwdfile.txt;
[root@xxx ~]# touch userpwdfile.txt
然后,用文本编辑器打开文件userfile.txt,添加如下内容;
win01:x:521:521::/home/win01:/sbin/nologin
win02:x:522:522::/home/win02:/sbin/nologin
win03:x:523:523::/home/win03:/sbin/nologin
win04:x:524:524::/home/win04:/sbin/nologin
win05:x:525:525::/home/win05:/sbin/nologin
win06:x:526:526::/home/win06:/sbin/nologin
win07:x:527:527::/home/win07:/sbin/nologin
win08:x:528:528::/home/win08:/sbin/nologin
win09:x:529:529::/home/win09:/sbin/nologin
userfile.txt 文件内容格式和 /etc/passwd 的格式是一样的,必须严格按照/etc/passwd 的格式来书写;
上面所添加的用户都不能登录系统,但完全能用于ftp登录,但要在相应ftp服务器的配置文件中打开让本地用户有读写权限;
如果想让上面的部份用户可以登录系统,可以把SHELL类似改一改,比如改成/bin/bash ;
新增用户的密码文件userpwdfile.txt内容;
这个文件的内容中的用户名要与 userfile.txt用户名相同;
即先是添加了win00到win09的用户,现在要为这些用户更新密码;
比如下面的;
win01:654321
win02:123321
win03:qweewq
win04:google
win05:adadwc
win06:wsscee
win07:xxec32
win08:543wew
win09:3ce3wf
2、通过newusers和chpasswd 完成批量添加用户;
[root@xxx ~]# chpasswd < userpwdfile.txt
如果发现 /etc/passwd 用户有明口令,可以通过如下命令映射到 /etc/shadow文件名;
本节主要内容:
dd命令生成指定大小的虚拟块设备文件
什么是虚拟块设备文件
虚拟块设备文件的通用名称为:硬盘镜像文件(Hard Disk Image),但不是所有的硬盘镜像文件都是虚拟块设备文件,例如,目前Ghost的GHO格式的镜像文件就不能成为虚拟机中的硬盘。
Linux的dd命令,可以用于生成虚拟块设备文件。
既可以用于创建空镜像文件,也可以用于创建物理硬盘的镜像。
例如:
将IDE设备/dev/hda的内容复制到/mnt/nebula/hda_dd.image文件。参数if告诉dd从哪个文件读取数据,参数 of告诉dd读出的数据写入哪个文件中。
注意,对于dd来说,输入和输出都是文件,dd做的只是文件拷贝工作,这得益于Unix/Linux下面将设备也抽象为特殊的文件。
一般来说设备文件有两种,一种是块设备,一种是字符设备。
块设备的特点是可以随机读写(Random Access),比如内存、硬盘等。字符设备的特点是顺序读写(Sequential Access),比如鼠标,键盘,麦克风等。
如果想生成空镜像文件,还需要一个特殊的设备。
/dev/zero是Linux提供的一个特殊的字符设备,它的特点是可以永远读该文件,每次读取的结果都是二进制0。
例子,生成一个100M的空镜像文件:
除了前面已经解释的of和if参数,这次又出现了bs和count参数。
bs=1M表示每一次读写1M数据,count=100表示读写 100次,这样就指定了生成文件的大小为100M。
bs参数还可以进一步细分为ibs和obs两种,为读操作与写操作分别指定不同的Buffer大小。
这样就生成100M的空镜像文件,问题是,如果要生成1G的虚拟块设备文件,就得占用1G的硬盘空间,而这个镜像文件完全是空的,是不是有一点浪费?
好在Linux支持Sparse(稀疏)文件。
例子
# ls -l 1G.img
-rw-r-r- 1 root root 1048576000 Mar 25 15:32 1G.img
# du -m 1G.img
用到了一个新的命令seek,表示略过1000个Block不写(这里Block按照bs的定义是1M),count=0表示写入0个Block。用ls命令看新生成的文件,大小可以看出是1000M。
但是再用du一看,实际占用硬盘大小只有1M。
以上介绍了,linux下dd命令生成指定大小虚拟块设备文件的方法,希望对大家有一定的帮助吧。
您可能感兴趣的文章:
linux下dd命令备份磁盘的节点(主引导记录)恢复数据linux中dd命令的用法详解
linux中dd命令使用详解
使用dd命令克隆磁盘的方法介绍
linux中dd命令详解(清除硬盘数据)
dd命令中seek和skip的用法
如何解决dd命令输出结果无法重定向到文件的问题
如何查看dd命令的拷贝进度