Linux学习札记(二):tar、vim的使用及正则表达式的介绍

本篇主要总结文件压缩、vim和正则表达式相关的知识点。

压缩与备份

压缩与解压文件

gzip:

1
2
3
4
[hui@linux tmp]$ gzip man.config #此时man.config 会变成 man.config.gz !
[hui@linux tmp]$ zcat man.config.gz #读取压缩文件的内容
[hui@linux tmp]$ gzip -d man.config.gz #解压文件
[hui@linux tmp]$ gzip -9 -c man.config > man.config.gz #解开的 man.config 用最佳的压缩比(1~9)压缩,并保留原文件

bzip2:

1
2
3
4
[hui@linux tmp]$ bzip2 -z man.config #此时man.config 会变成 man.config.bz2
[hui@linux tmp]$ bzcat man.config.bz2 #读取压缩文件的内容
[hui@linux tmp]$ bzip2 -d man.config.bz2 #解压文件
[hui@linux tmp]$ bzip2 -9 -c man.config > man.config.bz2 #解开的 man.config 用最佳的压缩比(1~9)压缩,并保留原文件

tar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#将整个/etc 目录下的文件全部打包成为 /tmp/etc.tar
[hui@linux ~]$ tar -cvf /tmp/etc.tar /etc #仅打包,不压缩!
[hui@linux ~]$ tar -zcvf /tmp/etc.tar.gz /etc #打包后,以 gzip 压缩
[hui@linux ~]$ tar -jcvf /tmp/etc.tar.bz2 /etc #打包后,以 bzip2 压缩
#查看压缩文件内容
[hui@linux ~]$ tar -ztvf /tmp/etc.tar.gz #如果查看bz2文件,则用-jtvf
#将/tmp/etc.tar.gz解压缩在/usr/local/src目录下
[hui@linux ~]$ cd /usr/local/src
[hui@linux src]$ tar -zxvf /tmp/etc.tar.gz
#或者使用如下命令
[hui@linux src]$ tar -zxvf /tmp/etc.tar.gz -C /usr/local/src
#只解压压缩包内某个文件
[hui@linux tmp]$ tar -zxvf /tmp/etc.tar.gz etc/passwd #注:指定文件的路径名里没有“/”
#将/etc/ 内的所有档案备份下来,并且保存其权限
[hui@linux ~]$ tar -zcvpf /tmp/etc.tar.gz /etc #参数p可用来保存文件原来的权限
#在 /home 当中,比 2005/06/01 新的文件才备份
[hui@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home

备份文件

1
hui@linux ~]# dd if="input_file" of="outptu_file" bs="block_size" count="number"

参数:

  • if :就是 input file 啰~也可以是设备!
  • of :就是 output file 喔~也可以是设备;
  • bs :设定的一个 block的大小,如果没有设定时,预设是 512 bytes
  • count:多少个bs的意思
1
2
3
4
5
6
7
8
#将/etc/passwd 备份到用户目录下的test目录中,并命名为passwd.back
hui@machine:~/test$ dd if=/etc/passwd of=~/test/passwd.back
4+1 records in
4+1 records out
2242 bytes (2.2 kB) copied, 0.000404902 s, 5.5 MB/s
#将整个 /dev/hda1 partition 备份下来。
[hui@linux ~]$ dd if=/dev/hda1 of=/some/path/filenaem #tar来用备份关键数据,dd用来备份整个分区的数据

vim

vim

**移动光标**
  • n n表示数字,按下数字再按空格,光标会向右移动n个字符的距离
  • n 按下数字再按回车,光标向下移动n行
  • $ 移动到这一行最后面的字符处
  • H、M和L 移动到屏幕最上、中间和最下行的首字符处
  • nG 移动到第n行

    编辑操作

  • :100,200s/vbird/VBIRD/g #在100到200行之间搜寻vbird并取代为VBIRD

  • :1,$s/word1/word2/g #从第一行到最后一行寻找word1字符串,并将该字符串取代为word2
  • :1,$s/word1/word2/gc #替代前询问是否替换
  • x,X 删除前一个字符,删除后一个字符
  • ndd 删除自光标向下n行
  • nyy 复制自光标向下n行
  • ctr+u 反撤销与”u“相反
  • . 重复前一个动作

    区块选择

  • v 字符选择,会将光标经过的地方反白选择

  • V 行选择,会将光标经过的行反白选择
  • ctrl + v 区块选择,可以用长方形的方式选择资料
  • y 将反白的地方复制起来
  • d 将反白的地方删除掉

bash

变量赋值

1
2
3
4
5
6
7
8
9
10
11
#若 str 这个变量内容存在,则 var 设定为 str ,否则 var 设定为 "newvar"
[hui@linux ~]$ unset str; var=${str-newvar}
#若 str 不存在,则 var 与 str 均设定为 newvar,否则仅 var 为 newvar
[hui@linux ~]$ unset str; var=${str=newvar}
#若 str 这个变量存在,则 var 等于 str ,否则输出 "novar"
[hui@linux ~]$ unset str; var=${str?novar}
#若str这个变量不存在或为空,var值为newvar
[hui@linux ~]$ unset str; var=${str:-novar}

别名

1
2
[hui@linux ~]$ alias rm='rm -i' #新建一个别名
[hui@linux ~]$ unalias lm

查看历史命令

1
2
3
4
5
6
7
[hui@linux ~]$ history #列出当前内存内的所有 history 记录
[hui@linux ~]$ history 3 #列出当前最近的 3 条件记录
[hui@linux ~]$ history -w #立刻将当前的资料写入 histfile 当中
[hui@linux ~]$ !number #执行第number条指令
[hui@linux ~]$ !command #由于最近指令向前查找开头为"command"的指令
[hui@linux ~]$ !! #执行前一个指令同“↑”

执行当前目录内的要执行文件

1
[hui@linux ~]$ ./squid #直接输入squid不行

登录信息

1
2
hui@hui-virtual-machine:~/test$ cat /etc/issue
Ubuntu 15.04 \n \l

自定义系统配置

  • ~/.profile 自定义路径 (PATH) 与环境变量等等,只有在系统登录时才会读取。
  • ~/.bashrc 设定自定义的值,每次执行shell script都会被系统读取
  • ~/.bash_history 记录用户的历史命令
  • ~/.bash_logout 注销bash后,系统要执行的操作

登录系统后,系统会依次读取/etc/profile,再根据不同的登录用户读取~/.profile,最后读取~/.bashrc。

更新配置文件

1
2
hui@hui-virtual-machine: source file
hui@hui-virtual-machine: . file #作用同上

设置预设信息

1
[hui@linux ~]$ set -u #设置 "若使用未定义变量时,则显示错误信息"

数据流重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[hui@linux ~]$ ll > huifile #将命令输出的信息重定向写入指定文件,文件若存在,原来内容会被清空。
[hui@linux ~]$ ll >> huifile #若指定文件存在,不清空文件内容,追加到文件里。
#输出正确信息的同时,用“2>”将错误的信息输出到指定文件
[dmtsai@linux ~]$ find /home -name testing > list_right 2> list_error
#将正确信息和错误信息写入同一个文件
[dmtsai@linux ~]$ find /home -name testing > list 2>&1
#去除错误的信息,/dev/null相当于一个虚拟的垃圾桶,输入的任何内容都会消失不见
[dmtsai@linux ~]$ find /home -name testing > list_right 2> /dev/null
[hui@linux ~]$ cat > catfile # 经由键盘输入内容到catfile内,文件不存在则创建
[hui@linux ~]$ cat > catfile < somefile #将原本由键盘输入改为从指定文件输入
#输入指定字符结束输入,如下以“lala”结束
hui@hui-virtual-machine:~/test$ cat > data2 <<lala
> a testing file
> haha
> lala
#目录存在才在相应的目录下建立文件
[hui@linux ~]$ ls /tmp && touch /tmp/testingagin
#文件不存在时才创建
[hui@linux ~]$ ls /tmp/vbirding || touch /tmp/vbirding

管道

cut常用分析日志等格式化的数据文件,用某些字符分割文本内容,处理多空格的文本文件比较吃力

1
2
3
4
5
6
7
8
9
10
11
#将PATH中的内容以“:”分成数段,取出第3段和第5段
[hui@linux ~]$ echo $PATH | cut -d ':' -f 3,5 #只取第n段,直接写n
#取出输出信息第3个字符及其以后的内容,如果是3-10,则取第3个到第10个字符
hui@hui-virtual-machine:~/test$ ll |cut -c 3-
#last用以查看最近登录的用户,下列命令用空格分段后,取第一段
hui@hui-virtual-machine:~/test$ last |cut -d ' ' -f 1
hui
jim
tom

grep 用以分析完整的一行信息

1
2
3
4
5
6
7
8
#last 当中,有出现 hui 的那一行就取出来
[hui@linux ~]$ last | grep 'hui'
#与上面的命令,只要没有 hui 的就取出!
[hui@linux ~]$ last | grep -v 'hui'
#在 last 的输出信息中,只要有 hui 就取出,并且仅取第一栏
[hui@linux ~]# last | grep 'hui' |cut -d ' ' -f 1

排序

1
2
3
4
5
6
7
8
9
10
11
hui@hui-virtual-machine:~/test$ cat data2| sort
alias is not a good girl.
bob will be successful.
david is so strong.
#以“ ”分列,按第三列排序
hui@hui-virtual-machine:~/test$ cat data2| sort -t " " -k 3
jim is a big man.
bob will be successful.
alias is not a good gilr.
david is so strong.

40.去除排序后的重复结果

1
2
3
4
5
6
7
8
9
10
hui@hui-virtual-machine:~/test$ cat data2 |cut -d " " -f 1 | sort | uniq
bob
deby
hui
jim
lily
#显示计数
hui@hui-virtual-machine:~/test$ cat data2 |cut -d " " -f 1 | sort | uniq -c
2 bob
2 deby

统计字数

1
2
3
#加-l、-w和-m可分别统计行、字和字符数
hui@hui-virtual-machine:~/test$ cat data1 | wc
9 19 128 #分别代表行数、关键字和字符数

数据流双重定向

1
2
3
# 将 ls的数据保存一份到 ~/homefile ,同时显示到屏幕上
[hui@linux ~]$ ls -l /home | tee ~/homefile | more
[hui@linux ~]$ ls -l / | tee -a ~/homefile | more #加-a以追加的形式保存

字符转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#将小写字母转换为大写
hui@hui-virtual-machine:~/test$ cat data1 | tr '[a-z]' '[A-Z]'
CLAS TES T {
PRIVATE STRING FUCKINGWORDS ;
...
#将 /etc/passwd 输出的讯息中的“:”删除
[hui@linux ~]$ cat /etc/passwd | tr -d ':'
#用对等的空格替换tab
hui@hui-virtual-machine:~/test$ cat -A data3
a^Ib^Ic^Id$ #tab以^I显示
m n o p q$
hui@hui-virtual-machine:~/test$ cat data3 | col -x| cat -A
i j k l$
m n o p q$
#用空格键替换tab,-t 后为空格数
hui@hui-virtual-machine:~/test$ expand data3 -t 2
a b c d

合并内容

1
2
3
4
5
6
7
8
9
10
11
12
#只是单纯地合并两个文件的内容
hui@hui-virtual-machine:~/test$ paste pro1 pro2
name jim name tom
age 22 age 23
#以“:”分割文本,第一个字段相同则合成一行
hui@hui-virtual-machine:~/test$ join -t ":" pro1 pro2
name jim tom
age 22 23
#先用cat将data2文件内容读出到标准输出(后面的‘-’),再用paste合并,读取前三行
hui@hui-virtual-machine:~/test$ cat data2|paste pro1 pro2 -|head -n 3
name jim name tom jim
age 22 age 23 tom

分割文件

1
2
3
4
5
6
[hui@linux tmp]$ split -b 300k /etc/termcap termcap #加-l则按行分割
[hui@linux tmp]$ ls -l termcap*
-rw-rw-r-- 1 hui hui 307200 8 月 17 00:25 termcapaa
-rw-rw-r-- 1 hui hui 307200 8 月 17 00:25 termcapab
-rw-rw-r-- 1 hui hui 184848 8 月 17 00:25 termcapac
[hui@linux tmp]$ cat termcap* >> termcapback #将上面分割的三个文件合并成一个

关于“-”

1
tar -cvf - /home | tar -xvf -

上述命令将/home 里面的文件给打包,但打包的数据不是保存到文件里,而是传送到stdout;
经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - 。后面的这个 - 则是取用前一个
指令的 stdout, 因此,我们就不需要建立文件了。

正则表达式

简单的使用

查找某个单词

1
2
3
4
5
6
#搜索指定文件内容里的the’并显示行号
[hui@test hui]$ grep -n 'the' regular_express.txt
#反向选择,显示出不含‘the’的行
[hui@test hui]$ grep -vn 'the' regular_express.txt
#忽视大小写
grep -in 'the' regular_express.txt

搜索指定字符

1
2
3
4
5
6
7
8
#搜索‘taste’和‘test’
[hui@test hui]$ grep -n 't[ae]st' regular_express.txt
#查找2个o及两个以上的go....g
[hui@test root]# grep -n 'go\{2,\}g' regular_express.txt
#查找以‘d’开头的文件
hui@hui-virtual-machine:~/test$ ls | grep -n '^d.*'
1:data1
2:data2

找出空白行

1
[hui@test hui]# grep -n '^$' regular_express.txt

特殊字符

特殊字符 作用
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )
* 匹配前面的子表达式零次或多次。要匹配 字符,请使用 \
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 .
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^
{ 标记限定符表达式的开始。要匹配 {,请使用 {
竖线 指明两项之间的一个选择。要匹配 竖线,请使用 竖线
反斜线 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\‘ 匹配 “\”,而 ‘(‘ 则匹配 “(“。

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

限定符 作用
* 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}
+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}
? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个
{n,} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格

定位符

定位符使你能够将正则表达式固定到行首或行尾。

定位符 作用
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配
\b 匹配一个字边界,即字与空格间的位置
\B 非字边界匹配

不能将限定符与定位点一起使用。由于在紧靠换行或者字边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。
若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。