虚拟机以及安装linux系统
安装新的virtualBox
1. VB ---> new aaa--->...new disk...--->finish
2. open aaa--->choose ubuntu-12.04-desktop-i386.iso --> ...click icon of install unbuntu --> about 30m, it'll restart --> 右下角图标,点击移除iso磁碟
3. install guest addtional in ubuntu menu // 共享,粘贴等重要功能
安装失败:sudo apt-get install build-essential // 安装一堆开发工具gcc,make等
4. 打开命令行: ctrl + alt + t
使window与virtualBox互相粘贴:
可直接在设置中修改:设置--〉一般--〉进阶
设置VB与window互访:
设置--〉共用资料夹 全勾选后并不需要下面的操作
( mount -t vboxsf win_folder /mnt/windows // write this to /etc/rc.local )
访问windows文件夹:ll /media/windowBag/
vdi文件的位置:设置--〉存放装置
F:\A_myTOP\ubuntu_12.04.1_null.vdi
D:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso
vb扩容:用UUID或者vdi文件来设置
(1) D:\Program Files\Oracle\VirtualBox>VboxManage list hdds
VBoxManage modifyhd 96fe8d50-7b14-4acf-a2f6-fd63ba59debd --resize 20480
VBoxManage modifyhd E:\wiUCS_project\webRTC\dld_doc\ubuntu_12.0.4.vdi.vdi --resize 20480 // 单位MB,so 20G
(2)fdisk , mkfs, mount
原来的扩张分区,导致新的磁盘空间无法在fdisk中显示 // 删除扩展分区后,再加入新分区,就 OK了
fdisk /dev/sda; m == menu ; d == del; n = new; w==write;
加入分区后要重启后,系统才认得。 mkfs -t ext3 /dev/sda2 ; mount /dev/sda2 /home/ding/extented_disk
安装新的VMware
VMware 配置
v0 : bridge v1 : host-only v8 : NAT(多了DHCP,NAT server )
新建aaa--->打开aaa,装入CentOS-6.3-x86_64-bin-DVD1.iso后,安装mini--->install vmware tools(自带,互相粘贴等功能)
1。需要修改网络配置:改为桥接后,/etc/sysconfig/network-script/ifcfg-eth0,另onboot=yes,MM_controlled=no
2. 修改DNS: echo "nameserver 8.8.8.8" > /etc/resolv.conf
3. 控制台没有滚动条,用shift+pageUp翻页
通过filezilla访问linux
sudo apt-get install openssh-server // 在VB中安装ssh/ftp server ,上传失败时以root登录
sudo passwd root // 修改密码
进入其它linux系统
sudo -s // 只有root用户,是所有机器上都有的角色;切换到root用户后,以root登陆ssh服务器
ssh other's IP // ssh user@ip
文件传输
安装ssh server, 用sftp进行安全的文件传输。其实sftp就是ssh 的一个程式
sftp [email protected]
下载: sftp > get /remote/index.php /local/
上传: sftp > put /local/Linuxgl.pdf /remote/fuyatao/
远端的命令: pwd命令可以帮您查询远程主机的当前路径。查询本机当前工作目录 lpwd. // 本机都加l=local
访问ftp服务器
sudo ftp 10.5.90.10 //windows上的
name: anonymous
ftp > cd temp/Whiteboard/lynckia_bag
ftp > ls
ftp > get lynckia_jinwei.tar.gz newName_lynckia.tar.gz
安装
在线安装
ubuntu: apt-get install XXX XXX
更新源:备份后搜索源来更新此文件 /etc/apt/source.list ; 再执行 sudo apt-get update
centos: yum -y install XXX XXX
包安装
ubuntu: dpkg -i XXX.deb
centos: rpm -ivh XXX.rpm // http://rpm.pbone.net/ ——这是一个给力的rpm包网站。
(-i==install, v=详细信息,h=hash, -e=erase删除,-U=升级)
安装包的转换rpm--->deb
apt-get install alien
alien --scripts *.rpm
检查是否已经安装
centos: rpm -qa |grep dhcp
ubuntu: dpkg --get-selections | grep office // 查找libreoffice是否卸载完成,否则用purge清除
apt-get purge libreoffice*
更新ubuntu
ubuntu--->system--->manager--->upgrade
mini版本安装后用yum下载
1。需要修改网络配置:改为桥接后,/etc/sysconfig/network-script/ifcfg-eth0,另onboot=yes,MM_controlled=no
2. 修改DNS: echo "nameserver 8.8.8.8" > /etc/resolv.conf
3. yum -y update
4. yum search XXX; yum install -y XXXX
yum建立本地源后进行安装:
Yum: Yellowdogy Updater Modified.软件仓库(repository)的源,可以是http,ftp站点,或者是本地的资源。
createrepo这个软件可以解决软件之间的依赖。
1. 在线下载nfs安装包: 先修改配置文件vi /etc/yum.conf 另 keepcache =1
yum install nfs-utils.x86_64
2. 默认从网上下载的安装文件存放在:/var/cache/yum,把之下的nfs相关的rpm包全部拷贝到/mnt/nfsSrc/x86_64
cp *.rpm /mnt/nfsSrc/x86_64
3. 创建软件库
createrepo /mnt/nfsSrc/
vi /etc/yum.repo.d/base.repo 另 baseurl=file:///mnt/nfsSrc/
4. 从本地源安装
yum install nfs-utils.x86_64
配置安装NFS
直接在本地包中安装:cd /mnt/nfsSrc/ ; rpm -ivh *.rpm
服务器:
配置: cat /etc/exports
/mnt/nfsServer 10.50.141.0/24(ro,no_root_squash) // 把某目录给这些地址共享(只读,root权限)
启动:/etc/init.d/rpcbind start
/etc/init.d/nfs start
检查:showmount -a
客户端:
检查服务器是否可用: showmount -e 10.50.141.22
挂载到服务器: mount -t nfs 10.50.141.22:/mnt/nfsServer /mnt/nfsClient -o nolock
未做的:
yum install rpcbind(centos6)
将nfs加入开机启动项chkconfig nfs on
安装配置jdk
0. 查看已经安装的版本: java -version
1. 安装bin或者把得到的jdk包直接拷贝到某目录
2. 设置环境变量: centos: vi /etc/profile ; source /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_45
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
3. 更新java版本
update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0/bin/java 60
update-alternatives --config java
4. 验证: java
安装eclipse
ubuntu_eclipse_install // install package
安装jdk: sudo dpkg -i java-1.6.0-openjdk_1.6.0.0-2.7_i386.deb
安装eclipse: eclipse-linuxtools-helios-SR1-incubation-linux-gtk.tar.gz
配置: sudo cp -r /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre ./
linux环境变量
显示变量: env; export; echo $WELCOME
设置新的: set env var; export WELCOME="hello";
设置只读: readonly WELCOME // (unset WELCOME) can't clear or modify
仅当前shell(控制台)有效: PATH=$PATH:/home/myplugin // linux用冒号分隔,window用分号
export:
1. 在控制台中执行脚本时,控制台是父shell, 脚本运行在子shell
2. 环境变量仅仅在当前shell中有效;当用export导出变量时,变量将在子shell中有效
so 当前和子shell(控制台中执行的script)有效: 控制台中执行 export PATH=$PATH:/home/temp
重启后仍有效: 将export那句添加到配置文件
centos: /etc/profile // all user
/home/brian/.bashrc // only user brian
source /etc/porfile // 配置文件立即生效
将脚本的执行结果导入到当前的shell: . ./ding_exec.sh or . /var/psbl_env
/var/psbl_env 导出某变量,这个结果导入到当前shell(控制台)。所以在控制台中执行的CLI(子shell)能够通过 getenv() 得到该变量
启动
1. 图形界面和字符界面的切换
alt+ctrl+F1-6 : 图形->字符
alt+ctrl+F7 : 字符->图形
2. 启动时指定界面: 3:字符 5:图形
vi /etc/inittab // 0:停止, 1:单用户, 2:多用户无NFS, 4:无用, 6:重启
3. 重新启动: alt+ctrl+Backspace
4. 当前运行级别时间: who -r
网络
显示以及临时修改
ifconfig eth0:0 XXX netmask XXX [boardcast XXX] // 在eth0上增加另一个IP
ifconfig eth0:0 down // 删除eth0:0
ifconfig eth0 XXX netmask XXX
route -n == netstat -rn
route add -net XXX netmask XXX gw XXX // route del -net...
route add default gw 192.168.1.1
hostname XXX
centos配置文件:
修改IP: /etc/sysconfig/network-scripts/ifcfg-eth0 //配置静态的 BOOTPROTO=static
1.拷贝VMware后,需要修改mac地址(在VM设置中), service network restart/reboot(卸载virtualBox可能网卡被占用)
2.增加一个网口,拷贝ifcfg-eth0后,修改重启即可。
DNS域名修改: /etc/resolv.conf
修改HOSTNAME: /etc/sysconfig/network
ubuntu配置文件:
修改IP: /etc/network/interfaces // address 192.168.0.111...
重启: sudo /etc/init.d/networking stop/start
下载分享
$ wget http://192.168.30.140/cgiPic/screen.bmp -O ./ttt.bmp // 其他类似工具axel, lftp
$ curl http://192.168.30.140/CGI/Screenshot -u dld:dld // 密码
python -m SimpleHTTPServer 8080 // 在需要共享的文件夹下执行此命令。 通过http://ip:8080来访问
sudo dhclient // client obtain ip via dhcp server
信号
# kill -l
4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 16) SIGSTKFLT 18) SIGCONT 19) SIGSTOP ......
信号0: // 退出shell。 ctrl+D
1) SIGHUP // 父进程结束,子进程收到。比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。
2) SIGINT // 来自键盘的终止: ctrl+C
3) SIGQUIT // 从键盘退出: ctrl+\
9) SIGKILL // 无条件终止: kill -9 进程号
15) SIGTERM // 程序正常退出时的处理
17) SIGCHLD // 子进程结束时,父进程会收到
20) SIGTSTP // 暂停并挂起,在屏幕上显示挂起的进程号: crtl+Z
进程
后台运行
crtl+Z // 暂停并挂起,在屏幕上显示挂起的进程号
bg num // 将暂停的程序放到后台运行
jobs // 显示后台运行的程序
fg num // 将暂停的程序放回前台运行
杀死
通过名字 sudo killall/pkill node
通过关键字杀掉多个相同的进程 PIS=`ps -efww | grep "$1" | grep -v "grep" | awk '{print $2}'`
echo ${PIS} | xargs kill
查询
ps -ef|grep careStr // ps -aux
netstat -apn |grep :22 // t=tcp, n=num, p=program, l=listen, a=all
lsof -i :22 // 根据端口号,谁在用22端口
让终端忽略挂断信号nohup: no hangup
& // 让命令在后台运行;
>file 2>&1 // 输出到某文件,否者输出到nohup.out
nohup $DAEMON_SH $PROCESS_CVT > $CVT_HOME/log/cvt.log 2>&1 &
打印进程中的线程个数
ps max -o %mem, lstart,lwp,pid,nlwp,cmd // 打印进程的:开始时间,tID,pID, 线程的个数,命令名
# ps max -o pid,nlwp,cmd |grep 3067
3067 270 node erizoController.js // 验证: ls /proc/3067/task 通过进程的pid可以得到线程的tid
线程:linux中每个进程的最大线程个数 = VIRT / 栈的大小
VIRT:virtual memory usage ; 栈大小用 ulimit -a查看
NTPL : linux中线程的实现的库 # getconf GNU_LIBPTHREAD_VERSION
系统
df -[ikmh] // 查看硬盘使用容量 h = human
du -[acs bkm] 目录 //查看档案的容量
du -sh /share/dld/ // 查看某个目录的大小
du --max-depth=1 -h ./ // 查看一级目录的大小
top -b -n 1 // 查看CPU,内存
top里显示的所有的cpu加起来的使用率,你的机子是多核吧,你运行top后按大键盘1看看,可以显示每个cpu的使用率,
从系统文件得到系统信息
pid: /proc/num
cmd: /proc/xxx/cmdline
task: /proc/xxx/task
status: /proc/xxx/status : short_cmd | state | ppid | time ...:
route: /proc/net/route
netstat: /proc/net/tcp
uid/gid: stat("/proc/xxx", &sb) getpwuid(uid)
重定向
0输入 1输出 2错误
ls >/dev/null 2>&1 // ls的标准输出不显示,标准错误同标准输出一样处理
cmd < file // file作为cmd的输入
cmd 2>> file // 把 stderr 重定向到 file 文件中(追加)
cmd 1>file // 把标准输出重定向到文件。 1> 等同于 >, 0< == <
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward // 是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案
cmd < inputFile > outputFile //
cmd < &m // 把文件描述符m作为标准输入
常用命令
find . -type d -name "*.svn"|xargs rm -rf
find . -name "*.sh" -exec chmod +x {} \;
find . -ctime 1 // 一天内新增的目录或档案
find . -newer .bashrc // 比 .bashrc 还要新的档案
find . -user test // 拥有者为 test 的档案
find | grep "mux" // 文件名含有mux的
find | xargs grep "mux" // 文件内容含有...
find | wc -l // 统计行数,即文件个数
tar zxvf xxx.tar.gz -C newDir // -C:在新目录中解压; -z zip; -x extract; -v verbose; -f archFile
tar zxmvf openssl-1.0.1e.tar.gz // 可以用 -m参数来把文件的时间(modify time)设置为当前系统的时间
或者解压后修改每个文件的时间 find . -exec touch -am '{}' \;
tar zcvf SMBIOS.tar.gz SMBIOS/ // 压缩 : -c creat/compansion
tar jxvf FileName.tar.bz2 // 解压bz2 : -j
tar jcvf FileName.tar.bz2 DirName
tar tvf xxx.tar.gz // 查看包里的内容
档案与目录管理: ls, cp, rm, mv, basename, dirname,
rm -rf XXX // 删除以及子目录
ll -trh // t=time, r=reverse, h=human
ll | grep "^d" // 查看目录,查看文件 grep "^-"
basename /etc/fstab // fstab
dirname /etc/fstab // /etc
mkdir -p XXXdir; touch XXXfile // 创建目录(-p 存在不创建)以及文件
档案与目录权限: chown, chmod, umask, chattr, lsattr,
chmod -R 777 XXX // -R: 子目录也
r=4, w=2, x=1; Usr/Group/Other/All ; // 对于目录, r=列出文件, w=增删文件, x=进入目录
ls -l /usr/bin/passwd -rwsr-xr-x // 以lidanding用户进入linux, 在执行时具有root权限 ; 若无x属性,则为大S
suid = 4, guid = 2; Set UID ( SUID ) 的主要功能是在『某个档案执行的期间具有档案拥有者的权限』
具有 sticky bit 属性的该”目录”下的档案,其档案或目录只有档案拥有者及 root 才有权力删除!
755 + sticky bit = chmod 1755 file // sticky == 1
文件属性:只能添加,不可修改。。。 +i // 文件不可改变
lsattr ../showCmd.c // ------------- ../showCmd.c
sudo chattr +i ../showCmd.c
lsattr ../showCmd.c // ----i-------- ../showCmd.c
sudo rm -rf ../showCmd.c // rm: cannot remove `../showCmd.c': Operation not permitted
文件中字符替换
替换一个文件: cat file|sed 's/old/new/g' > file2
批量替换: sed -i "s/oldString/newString/g" `grep oldString -rl /path`
grep oldString -rl /path | xargs sed -i "s/oldString/newString/g"
window,linux文件转换(win: /r/n == unix: /n, so need to del /r )
回车(return to head)== \r == ^M ==CR == 0D
换行(new line) == \n == ^J ==LF == 0A
在linux上检查window文件是否非法:
cat -v filename // cat -A winFile
:set ff=unix // 用vi来查看
文件转换win--->unix
dos2unix winFile unixFile
:%s/^m//g // 用vi来删除
文件查看: cat, tac, more, less, head, tail, nl, od,
wc -l file // -l 行数 -w 字数 -c 字符
cut -b5-9 file // 输出文件的5-9行
echo "a b c" | cut -d' ' -f 2 // -d 分隔符 -f 第几个域 结果:bc
cat >> log.txt << ding // 在log.txt中通过命令行输入,以ding结束,否则以ctrl+D结束
less xxx.c // 可上下翻页,可/Half 按 n 查找
nl xxx.c // == cat -n 显示行号
sudo od core-CLI-759-1331002286 // 查看二进制文件
查找文件或目录: which, whereis, locate, find,
locate dld // 记录在数据库文件中,所以先要同步 $ sudo updatedb
whereis -b ls // 也是数据库,只找到执行档?
which ls // 根据 PATH, 只找执行档
# lsb_release -a // 查看是什么linux系统以及版本 == cat /etc/issue
# uname -a // 查看处理器,硬件平台等
# file /bin/ls // 查看文件属性,文件类型
type -a pwd // 查看命令类型,是否是shell builtin
# getconf LONG_BIT // 查看系统的位数
cd /media/XXX // enter linux CD
多命令处理
find -type f | xargs dos2unix // 批量转换
tar lastfile.tar.gz `find . -mtime 1 -type f -print` // 将 `命令执行的结果` 当做参数
ls -l && pwd // first is ok, then exec second
cp 1.txt 2.txt || echo "fail to cp 1 to 2" // first is fail, then second
文字文本处理
正则表达式
// js中运用:用户名只能: 字母 数字 _ ()
var usern = /^[a-zA-Z0-9_\(\)]{1,}$/;
!username.match(usern)
^...$ // ^开头 $结尾 . 点为任意字符数字 ^$ 空行
[Aa]\{2, 4\} // A或a 出现2到4次
[^0-9\$] // ^在这里表示非,非数字或美元标识,
[Dd|ld]\. // Dld. dld.
以一个句点和两个数字开始 ^\.[0-9][0-9]
至少一个小写字母 [a-z][a-z]*
日期格式d d - m m - y y y y [0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}
以t h e开头行 ^[the]
包含m a y大写或小写字母的行 [mayMAY]
匹配任意行 [^.*$]
sed :以行为单位,处理字串的增,删,改
sed [-nefr] [动作] 文件 // 动作:del, read, write, quit, print,
TLINE=`sed -n '/^exit 0$/=' $0` // =行数 `反引号` $0这个表示脚本文件
sed "1,${TLINE}d" $0 >"${TMP_PATH}/wiucs.tar.gz" // d删除
sed -n '1,$p' a.txt // 打印1到最后一行;$表示最后一行
sed -n -e '/\$/'p -e '/\$/=' a.txt // 打印最后一行,以及它的行号; =表示行数;-e 多个条件
sed -i "s|\.\./wiucs-cvt|/opt/wiucs-cvt|" webmCvtServer.js
awk :以行为一次处理单位,以字段为处理单元,适用于数据库表
awk '条件类型1{动作1} 条件类型2{动作2}' filename
awk '{print $0}' data.txt // 打印 $0 == 所有域,$2 == 第二列
awk '{if($1~/34/) print $0}' data.txt // ' { if() print } '
awk '$2 == "dld" {print $0}' data.txt // ' == {print} '
awk 'END {print NR}' data.txt // NR == 行个数 NF == 域个数
awk -F/ '{print $NF}' // 当前目录名字,-F 设置域分隔符
grep :以行为单位,提取行中的字符串
grep [-acinv] '搜寻字符串' filename
grep -c "48" data.txt // count: data.txt中有几行包含48
grep -n "48" data.txt // num: 打印出行号以及行
grep -v "48" data.txt // 打印出不包含的行
grep -E '1|73' data.txt //扩展模式,正则表达式 查找含有1或者73的行
ll |grep '^d' // 仅仅查询目录, grep '^[^d]' 查询非目录
grep -r sys_getenv * // grep 根据文件的内容查找
shell
shell函数
NAME="aa bb"
functionA(){ //
echo $1 // 这里的$1是函数的参数
echo $2 // 这里的$2是函数的参数
}
functionA $NAME $1 // 这里的$1的是脚本的参数,结果: aa \n bb
functionA "$NAME" $1 // 加引号后作为整体传入参数,结果: aa bb \n cc
./funcA cc : 结果如上
shell脚本做成命令
chmod +x xxx.js
sh xxx.js stop // 执行脚本
cd /usr/bin ; ln -s xxx.sh wiucs // 软链接成命令
wicus stop // 执行命令
语法
num=2
echo "this is ${num}nd" // 结果:# this is 2nd,要带括号,否则不认得numnd
echo '$SHELL' = echo \$SHELL // 输出为 $SHELL,
echo "$AA" == echo $AA // 输出为AA的值
[ -x "file" ] || { echo "can't be exe"; exit 1; } // -n 非空串 -z 空串 -x可执行 -f 文件
[ "$var" = "$var2" ] [ $# -lt 3 ] // 等于,
if ...; then // 用分号代表括号,简写elif,倒序esac, 结束done,列举in
位置变量 :
$? 检查脚本返回的状态;
$0 脚本的名字;
$1 第一个参数;
$* 所有的参数
$# 参数的个数;
$$ processID
常用
USER='id -u' // 用户的id, root == 0. `这个不是单引号,是左上角的那个反引号`
read -p "yes or no?" ANSWER // echo $ANSSER
磁盘管理: 分区 fdisk --> 格式化 mke2fs --> 挂载 mount
fdisk -l // 直接查看分区情况
fdisk 磁盘 // enter
m // 帮助 manual
p // 查看 print
系统最多支持4个主分区,为解决分区不够的问题,又产生了扩展分区(extended)的概念。
这样,系统最多可以有3个主分区,一个扩展分区。在扩展分区中,又可以再分为多个逻辑分区,能从5分到16。
mke2fs /dev/fd0 // 格式化软盘为ext2:linux标准档案系统,包括inode table(档案的属性以及内容的指针),block area(档案的内容)
-j // ext3
-b -i // 修改 block, inode 大小
-c -L // 检查, 标签
e2label 分区 label
mount -t ext2 /dev/sdb /home // 挂载 参数 谁 挂在哪里
mount -t nfs -o nolock,rsize=1024,wsize=1024 XXXIP:/share /home/ding // 把网络上其他用户的共享文件夹,挂载到本地文件夹
mount //IP/winFolder /linux/folder -o username=wh1103028,passwd=wh118991! // 把window下的文件夹,挂载到linux下。
cat /etc/fstab // 设定开机时即挂载的方式 # <file system> <mount point> <type> <options> <dump> <pass>
写到 fstab(smbfs == cifs) : //IP/VOIP /home/.../voip cifs defaults,auto,username=admin,passwd=wh1103028! 0 0
-a -l -h -V // 挂fstab中的, 显示目前挂的 , 帮助, 版本
mount -o remount,rw / // 根目录重新挂载为读写
unmount /dev/sda // if 强制,退出目录后执行,卸载后才能把磁盘移走
切割与格式化硬盘:分区fdisk, 格式化mke2fs, e2label, mknod,
检查硬盘坏轨与数据同步化写入:磁盘检查fsck, badblocks, sync,
关于软盘开机片: 启动mkbootdisk, 低格fdformat,
虚拟内存 Swap: swap partition, swap file, dd, mkswap, swapon, swapoff,
VI
Vi有三种基本的工作模式:指令模式、文本输入模式、行末模式。
指令模式(Command Mode) 输入 a、i、o >>> 文本输入模式(Input Mode)
<<<按ESC进入
指令模式(Command Mode) 输入 : 冒号>>> 末行模式(Last line Mode)
<<<指令错误
指令模式
光标 : 光标移动同方向键 ( h 左 j 下 k 上 l 右) ; 第一列的上,中,下(H M L)
命令: x(删除当前光标字符) / X(删除光标前的字符) d(删除一行) / D(删除一行中从光标开始后面的字符)
i(光标前添加字符) / I (行首插入) a(光标后面添加字符) / A(行尾添加) o(下方插入空行) / O(上方)
末行模式
显示行号: :set nu
退出: :wq :q! (不保存) :x
查询: /hi (查找hi) n(顺序找下一个) / N(反序)
替换:
复制:
指令模式下: 复制3行/粘贴:3yy/p; 复制部分:v --->l------>y, p
末行模式下: 1, 3 co 5 //1到3行复制到第五行; 命令:co, m, d, // copy, move, delete
指令+末行 : 用ma,mb,mc在指令模式下做标志, 'a, 'b m 'c // 把a,b标记之间的行复制到c处
多个文件之间的复制
vi -o 1.sh 2.sh 或者 :sp 2.sh // ctrl + ww == ^ww, 进行切换; sp == split
linux bin文件的制作: bin = install.sh(安装脚本) + xxx.tar.gz(安装文件)
cat install.sh xxx.tar.gz > yyy.bin (因此,bin中的install.sh需要把它后面的二进制数据恢复成xxx.tar.gz,然后执行安装过程)
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/xxx.tar.gz" 2>/dev/null //去掉第一行到"exit 0"间的数据,后面的数据保存为xxx.tar.gz