Linux文本查看工具

[TOC]

在Linux系统中,一个核心理念就是:一切皆文件。正确的对系统中文本的编辑配置与管理是Linux系统得以稳定运行的一个重要大前提。
因此Linux系统中的文件与管理特别重要,下面简单说一下在对文件处理过程中经常用到的一些工具。
文本查看命令:cat,tac,rev,more,less

cat [option]...[file]...
    -E:显示行结束符$
    -n:显示行号
    -A:显示所有控制符eg:tab键就显示为 ^I
    -b:非空行编号,即空行不显示行号,略过
    -s:压缩连续的空行成一行
    
tac [option]...[file]...
    -b, --before    在行前而非行尾添加分隔标志【默认换行】
    -r, --regex     将分隔标志视作正则表达式来解析
    -s, --separator=字符串 使用指定字符串代替换行作为分隔标志 -s="#"

rev [options] [file ...]
reversing the order of characters in every line:将每一行的显示翻转过来
注意这里tac和rev不同的地方是,tac是将整个文档以行为单位翻转,而rev是以每一个字符为单位,在一行的范围内翻转。ABC-->CBA  而tac 是 ABC 【第一行】 123【第二行】 -->123【第一行】ABC【第二行】

more [options] file [...]  翻到底自动退出
less [options] file [...]  翻到底不会自动退出(man帮助查看就是用的less用法)

head [OPTION]... [FILE]...
    -c # :指定获取前#个字节
    -n # 或 -# : 指定获取行数
    tail [OPTION]... [FILE]...
    -c # :指定获取前#个字节
    -n # 或 -# : 指定获取行数
    -f :跟踪显示文件新追加的内容,常用语日志监控
    
cut [OPTION]... [FILE]...
    -d : 指明分隔符,默认tab  。eg:-d" ",以空格为分割
    -f FILEDS:      #: 第#个字段    #,#[,#]:离散的多个字段,例如1,3,6
                    #-#:连续的多个字段, 例如1-6      混合使用:1-3,7
    -c按字符切割   cut -c 1-10 anaconda-ks.cfg
    --output-delimiter=STRING指定输出分隔符
    
paste 合并两个文件同行号的列到一行
    paste [OPTION]... [FILE]...
    -d 分隔符:指定分隔符,默认用TAB
    -s : 所有行合成一行显示
    paste f1 f2
    paste -s f1 f2  先合并成一行,在追加。n个文件就显示n行。

wc [OPTION]... [FILE]...
     -c, --bytes    显示  字节数     
     -m, --chars    显示  字符数        
     -l, --lines    显示  行号
     
sort [OPTION]... [FILE]...   
    -r执行反方向(由上至下)整理
    -n执行按数字大小整理 默认是按字符排序,即1,11,12...19,2,21...
    -f选项忽略(fold)字符串中的字符大小写
    -u选项(独特,unique)删除输出中的重复行    

uniq[OPTION]... [FILE]...
    -c: 显示每行重复出现的次数
    -d: 仅显示重复过的行
    -u: 仅显示不曾重复的行
    【连续且完全相同方为重复】
     
diff foo.conf-brokenfoo.conf-works   
比较两个文件的不同

Linux用户和组

[TOC]

1、用户

个人理解的是,给使用者一个在系统中使用的身份,即用户。
用户分两种:管理员和普通用户。
而每一个用户都有一些属性,每一个属性都是用冒号分割开来。配置文件存储在【/etc/passwd】中。
例如,sarash:x:507:508::/home/sarash:/bin/nologin
他们分别是,用户名,密码,ID号,主组ID号,注释,家目录,默认登录shell
用户名是用来登录的账号,密码位置并没有存储真正的密码在这里,只是一个占位符。如果的确想要看到密码存储结果,可以使用命令:pwunconv。
其中 pwconv, pwunconv, grpconv, grpunconv - convert to and from shadow passwords and groups 就是用户密码隐藏 显示 组密码隐藏显示的命令
增加用户的常用命令是:
useradd [options] login

-u UID: [UID_MIN, UID_MAX]定义在/etc/login.defs
-o 配合-u 选项,不检查UID的唯一性
-g GID:指明用户所属基本组,可为组名,也可以GID
-c "COMMENT":用户的注释信息
-d HOME_DIR:以指定的路径(不存在)为家目录
-s SHELL: 指明用户的默认shell程序  在/etc/shells文件中有系统可用shell
-G GROUP1[,GROUP2,...]:为用户指明附加组,组必须事先存在
-N 不创建私用组做主组,使用users组做主组
-r: 创建系统用户CentOS 6: ID<500,CentOS 7: ID<1000

userdel [options] LOGIN
-f, –force 删除用户的主目录和邮箱,即使用户登录中,或者邮箱公用
-r 删除用户家目录及邮箱
【注意】:在新建服务型用户的时候(例如MySQL),由于这些用户不需要登录(/bin/nologin),也不需要家目录,所以定义成系统用户最好。可以防止恶意的登录。
一般来说, 199 会保留给系统预设的帐号,另外 100499 则保留给一些服务来使用。centos7 就加倍。

#cat 【/etc/default/useradd】  用户配置信息
# useradd defaults file     --新增用户时的默认信息
GROUP=100                   --user组的组ID
HOME=/home                  --默认家目录路径
INACTIVE=-1                 --宽限期?
EXPIRE=                     --口令有效期?
SHELL=/bin/bash             --默认shell
SKEL=/etc/skel              --默认配置信息文件
CREATE_MAIL_SPOOL=yes       --是否创建邮箱

2、密码

#cat /etc/shadow
root:$6$f3B1B1NC$zybHBGqE/SWMtRVk8iqVz.WP.JC/kmBDajcPc4JFcwsPZS/RvsJqJDTZMGtH7CSs5guC40DqXWegF7zRY/x7M1:17089:0:99999:7:::
该配置文件中以":"分割,分别代表:用户名,密码,上一次修改时间,两次修改密码相隔最短时天数,两次修改密码最长天数,提前多少天提示用户修改密码,口令过期几天后禁用,用户过期日期--从1970年算起,最后是保留字段
对于密码位置的解释:
$6$:这个6 表是加密方式。1:MD5 5:SHA-256 6:SHA-512(常见)更改加密算法 authconfig--passalgo=sha256 --update
$f3B1B1NC$:这就是salt,盐。加密的时候,根据用户的密码,加上这串字符,组成了独一无二的密码显示格式。
$第三串字符$:加密后的字符。用户登录时 ,加密格式+salt+输入密码=密码字符串。 单向,不能逆算。得出的字符串相同才能登录。
1、如果密码为空,则该用户在登录时,无须输入密码即可登录,这在做一些测试的时候可以用到。
2、如果密码为!+密码,表示该用户已经被锁定了。
3、!! 如果是两个叹号,表示该用户还没有设置密码,或者说用户的密码已经过期。
4、*,在服务用户那边有些是星号【,。。。好像是不需要密码,网上暂时没找到解释,节约时间先留下】

对于/etc/login.defs 这个文件配置信息如下
MAIL_DIR    /var/spool/mail  --邮件目录

PASS_MAX_DAYS   99999  --密码最长使用天数 99999 相当于无限大
PASS_MIN_DAYS   0      --密码最小禁止修改的时间,即在这个时间内禁止密码再次修改
PASS_MIN_LEN    5     --密码最小长度
PASS_WARN_AGE   7     --密码过期前多少天开始给予提醒

UID_MIN           500 --用户新建最小ID号
UID_MAX         60000 --用户新建最大ID号
GID_MIN           500 --用户组新建最小ID号
GID_MAX         60000 --用户组新建最大ID号

CREATE_HOME yes       --默认是否创建家目录
UMASK           077   在家目录新建文件的权限umusk值
USERGROUPS_ENAB yes   --删除用户时 如果用户组没有用户是否删除用户组
ENCRYPT_METHOD SHA512 --加密格式

用法:usermod [选项] 登录(用户名)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
选项:
-c, --comment 注释 GECOS 字段的新值
-d, --home HOME_DIR 用户的新主目录
-e, --expiredate EXPIRE_DATE 设定帐户过期的日期为 EXPIRE_DATE
-f, --inactive INACTIVE 过期 INACTIVE 天数后,设定密码为失效状态
-g, --gid GROUP 强制使用 GROUP 为新主组
-G, --groups GROUPS 新的附加组列表 GROUPS
-a, --append GROUP 将用户追加至上边 -G 中提到的附加组中,
并不从其它组中删除此用户
-l, --login LOGIN 新的登录名称
-L, --lock 锁定用户帐号
-m, --move-home 将家目录内容移至新位置 (仅于 -d 一起使用)
-o, --non-unique 允许使用重复的(非唯一的) UID
-p, --password PASSWORD 将加密过的密码 (PASSWORD) 设为新密码
-R, --root CHROOT_DIR chroot 到的目录
-s, --shell SHELL 该用户帐号的新登录 shell
-u, --uid UID 用户帐号的新 UID
-U, --unlock 解锁用户帐号
-Z, --selinux-user SEUSER 用户账户的新 SELinux 用户映射

3、用户组

具有某种共同特征的用户集合起来就是用户组(Group)。用户组(Group)配置文件主要有 /etc/group和/etc/gshadow
cat/etc/group
root:x:0:gentoo
users:x:100:
/etc/group 的内容包括用户组(Group)、用户组口令、GID及该用户组所包含的用户(User),每个用户组一条记录;格式如下:
group_name:passwd:GID:user_list   用户组的GID如同UID,系统组在500或者1000以下。

4、用户组密码

对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码;
cat /etc/gshadow
格式如下:
groupname:password:admin,admin,...:member,member,...
密码位置如果为!或者为空表示无须密码,或者尚未设置密码。

Linux系统grep的使用

[TOC]

grep:

Global search REgular expression and Print out the line .

文本过滤工具,根据用户指定的模式对目标文本进行匹配检查;打印匹配到的行。过滤即不改变原来文本数据。这对于在输出较多信息或者文本内容较多的信息中寻找指定信息很有帮助.

比如想查看文件ifcfg-eth0中配置的网络是多少,你只需要显示有IPADDR这一行:

1
2
#grep IPADDR ifcfg-eth0 
IPADDR=172.16.10.18

这样,就会显示ifcfg-eth0 文件中包含有IPADDR的行.

当然grep还有很多参数可以帮助我们更精确的找到想要的内容,下面列举几个最常用的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
grep [options] PATTERN [file...]
--color=auto: 对匹配到的文本着色显示
-v:显示不被pattern匹配到的行
-i:忽略大小写 #上面的就可以写成 grep -i ipaddr ifcfg-eth0
-n:显示匹配的行号
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何模式
-A #:after,后#行一并显示
-B #:before,前#行一并显示
-C #:context,前后#行一并显示
-e:实现多个选择间的逻辑或关系--> grep -e ‘cat’ -e ‘dog’ file
grep的PATTERN 支持正则表达式,支持正则表达式的还有 vim,less,nginx等

grep还可以配合管道命令使用:

1
2
3
[root@node7 ~]#lspci | grep -i network 			#lspci的结果直接通过grep过滤显示
81:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
81:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)

正则表达式

regexp,由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能.比如:

1
2
grep "ip.ddr" ifcfg-eth0 
#这里的这个点"." 代表匹配任意单个字符,那么匹配到的内容可能是"ipaddr" "ipbddr" "ipcddr" ... 只要i字母后面接的任何单个字母再加上ddr 都能够被命中.这就是通配符的力量

正则表达式有基本正则表达式(BRE)和扩展正则表达式(ERE)两种,元字符分类则有四种:字符匹配、匹配次数、位置锚定和分组

字符匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
字符匹配:
. 表示匹配任意单个字符
[] 表示匹配指定范围内的任意单个字符
[^] 表示匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 英文字母
[:lower:] [:upper:] 大、小写字母
[:blank:] (空格和制表符tab)
[:space:] 垂直和水平的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃。。。)
[:digit:] [:xdigit:] 十进制数字,十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印的字符
[:punct:] 标点符号

eg:

1
2
grep "[:blank:]"  ifcfg-eth0 
#显示文件中有空格或者制表符的行

匹配次数

1
2
3
4
5
6
7
匹配次数:
* 匹配前面的字符任意次,包括0次。在贪婪模式下:即尽可能长的匹配
.* 任意长度的任意字符
\? 匹配器前面的字符 0或1次
\+ 匹配其前面的字符至少一次
\{n\} 匹配前面的字符n次
\{m,n\}匹配其前面的字符至少m次,至多n次

eg:

1
2
grep "[:digit:]\{3\} "  ifcfg-eth0 
#匹配文件中三个数字的行

位置锚定

1
2
3
4
5
6
7
位置锚定:
^ 行首锚定
$ 行尾锚定
^pattern 用于模式匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行
\<,\b 词尾锚定
\>,\b 词首锚定
\<pattern\> 匹配整个单词

eg:

1
2
grep "^$"  ifcfg-eth0 
#匹配文件中的空行

分组

1
2
3
4
5
6
7
8
分组:
\(\) 将一个或多个字符捆绑在一起当做一个整体进行处理,eg:\(root\)\+
分组括号中的的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名 方式为:\1,\2,\3,...
\1 表示从坐骑第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
示例:\(string1\+\(string2\)*\)
\1 :string1\+\(string2\)*
\2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本省

扩展正则表达式

扩展正则表达式想要呈现的效果和正则表达式一样,只是只是匹配规则不一样.匹配规则主要是减少了正则中转移用的反斜杠”"

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
26
27
egrep及扩展正则表达式
egrep = grep -E
egrep [options] pattern [file...]

扩展正则表达式的元字符:
字符匹配:
.
[]
[^]
次数匹配:
*
?
+
{m}
{m,n\}
位置锚定:
^
$
\<,\>,\b
分组:
()
后向引用:\1,\2...
或者:
a|b : a 或b
C|cat :C 或者cat
(C|c)at: Cat或者cat

Linux awk

[TOC]

awk介绍

awk是Linux三剑客中功能最强大,使用最复杂的命令。强大到awk都成为一种语言了,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。

awk基本用法

输入awk就可以看到awk简要帮助,下面就结合我自己查找资料和使用之后的一个总结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
awk基本用法
awk [options] 'program' var=value file…
awk [options] -f programfile var=value file…
'program' = 'BEGIN{ action;… } pattern{ action;… } END{ action;… }'

options(选项):
-f progfile --file=progfile #从文件中读取program语法
-F fs --field-separator=fs #字段分隔符,默认空格
-v var=val --assign=var=val #自定义变量
#官方简单例子,将/etc/passwd以冒号":"分隔,将得到的的第一列打印
#gawk -F: '{ print $1 }' /etc/passwd
root
bin
daemon
...

1.分隔符.域和记录

awk执行时,参数-F 的值就是分隔符,不写默认为空格.

分割出来的字段就是域,从前往后一次标记为$1,$2,$3...$n 称为域标示.$0为所有域.

文件的每一行称为一条记录.

2.awk语法

1
2
3
4
5
6
program: 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' 
pattern和action:
pattern部分决定动作语句何时触发及触发事件(BEGIN,END 也是属于pattern中的特殊部分吧)
action statements对数据进行处理,放在{}内指明
(print, printf)

3.awk工作过程

awk的工作过程:
第一步: 执行 BEGAIN{action;…} 语句块中的语句,如果没有就跳过此步骤.
第二步: 从文件和标准输入读取一行(就是一条记录),然后按照pattern中匹配中了就执行后面的 { action;… } ,然后读取下一条记录匹配执行,重复这个过程知道文件全部读取完毕.
第三步: 执行 END{ action;… } 语句块中的语句,如果没有就跳过此步骤.

注意:

pattern是可选的,省略action,则默认执行print $0 的操作.但是呢,pattern和{ action;} 不能同时省略.

1
2
3
4
5
6
7
8
9
10
11
12
13
[yhu@master model]$awk /root/{print} /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[yhu@master model]$awk /root/ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[yhu@master model]$awk {print} /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...

4.print格式

print格式:print item1, item2, …
要点:

​ (1) 逗号分隔符
​ (2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式,输出的各项item 以空格隔开(默认)
​ (3) 如省略item,相当于print $0
示例:

1
2
3
4
awk –F: ‘{print $1}’ /etc/passwd  #冒号分割,每一条记录打印第一个域
awk –F: ‘{print $0}’ /etc/passwd #冒号分割,每一条记录打印全部域
awk –F: ‘{print $1”\t”$3}’ /etc/passwd #冒号分割,每一条记录打印第一个域一个制表符再打印第三个域
tail –3 /etc/fstab|awk ‘{print $2,$4}’ #传入/etc/fstab后三行,空格分割,每一条记录打印第二个域和第四个域

5.awk变量

变量分为内置变量和自定义变量.

内置变量

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
FS:输入字段分隔符,默认为空白字符 filed separator
awk -v FS=':' '{print $1,$3,$7}' /etc/passwd
awk –F: '{print $1,$3,$7}' /etc/passwd
OFS:输出字段分隔符,默认为空白字符 output filed separator
awk -v FS=':' -v OFS='-' '{print $1,$3,$7}' /etc/passwd
RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效 record separator
awk -v RS=' ' '{print }' /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符 output record separator
awk -v RS=' ' -v ORS='###' '{print }' /etc/passwd
NF:字段数量 number filed
awk -F: '{print NF}' /etc/passwd ,引用内置变量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
NR:行号 number row
awk '{print NR}' /etc/fstab;
awk END'{print NR}' /etc/fstab
awk 'BEGIN{print 0} {print NR} END{print NR}' /etc/fstab
FNR:各文件分别计数,行号 file number row
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:当前文件名
awk '{print FILENAME}' /etc/fstab
ARGC:命令行参数的个数 arguement count
awk '{print ARGC}' /etc/fstab /etc/inittab
awk 'BEGIN{print ARGC}' /etc/fstab /etc/inittab
ARGV:数组,保存的是命令行所给定的各参数 arguement value
awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/
--> awk
awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab
--> /etc/fstab
自定义变量(区分字符大小写)
(1) -v var=value
(2) 在program中直接定义
示例:
awk -v test='hello gawk' '{print test}' /etc/fstab
awk -v test='hello gawk' 'BEGIN{print test}'
awk 'BEGIN{test="hello,gawk";printtest}'
awk –F:‘{sex=“male”;print$1,sex,age;age=18}’ /etc/passwd

cat awkscript
{print script,$1,$2}
awk -F: -f awkscriptscript=“awk” /etc/passwd

自定义变量

自定义变量可以在两个地方定义:

1
2
(1) -v var=value
(2) 在program中直接定义

示例:

1
2
3
4
5
6
7
awk -v test='hello gawk' '{print test}' /etc/fstab
awk 'BEGIN{test="hello,gawk";print test}'
awk –F: '{sex="male";print$1,sex,age;age=18}' /etc/passwd

cat awkscript
{print script,$1,$2}
awk -F: -f awkscript script=“awk” /etc/passwd

6.printf

printf : 格式化输出,输出各种你想要的格式.(ascii,十进制整数,十六进制,无符号,小数…)

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
printf “FORMAT”, item1, item2, ...
FORMAT格式符:与item一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%: 显示%自身
FORMAT修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐)%-15s
+:显示数值的正负符号%+d

注意:

1
2
3
4
(1) 必须指定FORMAT,记得加引号
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
(4) 是printf哦,不是print

示例:

1
2
3
4
5
6
7
awk -F: '{printf "%s",$1}' /etc/passwd
awk -F: '{printf "%s\n",$1}' /etc/passwd
awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %s\n",$1}' /etc/passwd
awk -F: '{printf "Username: %s,UID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %15s,UID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %-25sUID: %d\n",$1,$3}' /etc/passwd

7.操作符

awk操作符就多了,有算数操作符,字符串操作符,赋值操作符,比较操作符,模式匹配符,逻辑操作符.是不是在学一门语言啊?O(∩_∩)O哈哈~ 其实每一个都很简单,就一般程序操作符基本一样.来看下

算数操作符

1
2
3
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值

字符串操作符

在没有符号的操作符,字符串就连接起来了.

赋值操作符

1
2
=, +=, -=, *=, /=, %=, ^=
++, --

模式匹配符

1
2
3
4
5
6
~:左边是否和右边匹配包含
!~:是否不匹配
awk -F: '$0 ~ /root/{print $1}' /etc/passwd
awk '$0~"^root"' /etc/passwd
awk '$0 !~ /root/' /etc/passwd
awk -F: '$3==0' /etc/passwd

逻辑操作符

1
2
3
4
5
6
7
8
与&&
或||
非!
示例:
awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
awk -F: '!($3==0){print $1}' /etc/passwd
awk -F: '!($3>=500) {print $3}' /etc/passwd

函数调用

1
function_name(argu1, argu2, ...)

条件表达式

1
selector?if-true-expression:if-false-expression

示例:

1
2
3
4
5
awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf"%20s: %-s\n",$1,usertype}' /etc/passwd

# selector --> ($3>=1000)
# if-true-expression --> (usertype="Common User")
# if-false-expression --> (usertype="Sysadmin or SysUser")

8.awk pattern

pattern:根据pattern条件,过滤匹配的行,在做处理

(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

1
2
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab

(3) relational expression: 关系表达式,结果为“真”才会被处理

1
2
3
4
5
6
7
8
真:结果为非0值,非空字符串
假:结果为空字符串或0值
awk -F: 'i=1;j=1{print i,j}' /etc/passwd
awk '!0' /etc/passwd; awk '!1' /etc/passwd
awk -F: '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$3<1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd

(4) line ranges:行范围

startline,endline:/pat1/,/pat2/不支持直接给出数字格式

1
2
awk -F: '/^root\>/,/^nobody\>/{print $1}' /etc/passwd
awk -F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd

(5) BEGIN/END模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次

示例:

1
2
3
4
5
6
7
8
9
10
awk -F: 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "end file"}' /etc/passwd
awk -F: '{print "USER USERID“;print $1":"$3} END{print "end file"}' /etc/passwd
awk -F: 'BEGIN{print " USER UID \n---------------"}{print $1,$3}' /etc/passwd
awk -F: 'BEGIN{print "USER UID \n--------------------------"} {printf "%-20s%s\n" ,$1,$3} END{print "========================="}' /etc/passwd
seq 10 |awk 'i=0'
seq 10 |awk 'i=1'
seq 10 | awk 'i=!i'
seq 10 | awk '{i=!i;print i}'
seq 10 | awk '!(i=!i)'
seq 10 |awk -v i=1 'i=!i'

9.awk action

常用的action分类
(1) Expressions:算术,比较表达式等
(2) Control statements:if, while等
(3) Compound statements:组合语句
(4) input statements
(5) output statements:print等

控制语句

action中的控制语句是强大的,现在挑几个重要且常用说:

1
2
3
4
5
6
7
8
9
10
11
{ statements;… } 组合语句
if(condition) {statements;…}
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…}
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
delete array[index]
delete array
exit

if-else

语法:

1
2
3
if(condition){statement;…}[else {statement;…}]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}

使用场景:对awk取得的整行或某个字段做条件判断
示例:

1
2
3
4
5
6
7
8
9
awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
awk '{if(NF>5) print $0}' /etc/fstab
awk -F: '{if($3>=1000) {printf"Common user: %s\n",$1} else {printf"root or Sysuser: %s\n",$1}}' /etc/passwd
awk -F: '{if($3>=1000) printf "Common user: %s\n",$1;
else printf "root or Sysuser: %s\n",$1}' /etc/passwd
df -h|awk -F% '/^\/dev/{print $1}'|awk '$NF>=80{print $1,$5}‘
awk 'BEGIN{ test=100;if(test>90){print "very good"}
else if(test>60){ print "good"}else{print "no pass"}}'

while

语法:while(condition){statement;…}

条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用
示例:

1
2
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i); i++}}' /etc/grub2.cfg
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10) {print $i,length($i)}; i++}}' /etc/grub2.cfg

do-while

语法:do {statement;…} while(condition)
意义:无论真假,至少执行一次循环体
示例:

1
awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}'

for

语法:for(expr1;expr2;expr3) {statement;…}

特殊用法:能够遍历数组中的元素;
语法:for(varin array) {for-body}

1
2
3
4
5
6
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
性能比较:
time(awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')
time(total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)
time(for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)
time(seq -s "+" 10000|bc)

switch

语法:

1
switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2;...; default: statementn}

break和continue

1
2
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}'

函数

数值处理:
rand():返回0和1之间一个随机数

1
awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'

字符串处理:
length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s

1
echo "2008:08:08 08:08:08" | awk 'sub(/:/,“-",$1)'

gsub(r,s,[t]) :对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

1
echo "2008:08:08 08:08:08" | awk 'gsub(/:/,“-",$0)'

split(s,array,[r]) :以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…

1
netstat-tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (iin count) {print i,count[i]}}'

自定义函数

格式:

1
2
3
4
function name ( parameter, parameter, ... ) {
statements
return expression
}

示例:

1
2
3
4
5
6
7
#cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}
#awk –f fun.awk

调用shell命令

system命令

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用””引用起来。

1
2
awk BEGIN'{system("hostname") }'
awk 'BEGIN{score=100; system("echo your score is " score) }'

10.调用脚本

将awk程序写成脚本,直接调用或执行

示例:

1
2
3
4
5
6
7
8
9
10
11
12
#cat f1.awk
if($3>=1000)print $1,$3}

#awk -F: -f f1.awk /etc/passwd

#cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}

#chmod +x f2.awk
#f2.awk –F: /etc/passwd

测试:

1
2
3
4
1、统计/etc/fstab文件中每个文件系统类型出现的次数
2、统计/etc/fstab文件中每个单词出现的次数
3、提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
4、解决DOS攻击生产案例:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔5分钟。防火墙命令为:iptables -A INPUT -s IP -j REJECT

Linux磁盘管理

[TOC]

1
2
3
4
5
6
7
8
9
10
11
12
13
在系统中,常见的硬盘接口有分两类:并行的和串行的
并行:
IDE: 133MB/s
SCSI: 640MB/s
串行:
SATA: 6Gbps
SAS: 6Gbps
USB: 480MB/s
存储设备的设备文件命名方式大致为:/dev/DEV_FILE
IDE: /dev/hd# #-->0,1,2,3
SCSI,SATA,SAS,USB: /dev/sdx x表示a-z eg:/dev/sda,/dev/sdb
光盘中显示的是 /dev/sr0,/dev/sr1...
同一设备上的不同分区:1,2,3... eg:/dev/sda1,/dev/sda2...

想要使用一块没有用过的磁盘,需要做一下几部:

1、设备识别,即首先要讲磁盘接入设备中,在系统中能够看到设备(/dev/DEV_FILE)
2、设备分区,全新的磁盘是没有分区的
3、创建文件系统,主要明确在设备上存储的数据是什么格式的.(ext3,ext4,NTFS...)
4、标记文件系统
5、在/etc/fstab文件中创建条目
6、挂在新的文件系统  

磁盘分区:

1
2
3
4
5
6
7
8
9
10
11
12
磁盘分区的理由:
1、优化i/o性能
2、实现磁盘空间配额限制
3、提高修复速度
4、隔离系统和程序
5、安装多个OS
6、采用不同文件系统
两种分区方式:MBR,GPT
MBR: master boot record ,使用32位表示山区数,分区不超过2T,按柱面分区
在0磁道0扇区的512bytes中,前446bytes:BootLoader,64bytes:分区表(其中16byte表示一个分区,因此主分区+扩展分区<=4)最后2byte:55AA
GPT:GUID(global unique identifiers) partition table 支持128个分区,使用64位,支持8Z(512byte/block) 64Z(4096byte/block)
使用128位UUID(universally unique identifier )表示磁盘和分区,GPT分区表自动备份在头和尾两份,并有CRC校验位

管理分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
列出块设备:lsblk
创建分区:fdisk(MBR),gdisk(GPT),parted 高级分区操作(创建,复制,调整大小等)
partprobe 重新设置内存中的内核分区表版本
fdisk gdisk命令类似,下面主要介绍fdisk的使用
fdisk [options] <disk> change partition table
fdisk [options] -l <disk> list partition table(s)
交互式fdisk命令其实更适合使用,分区之后可查看,可修改,只有在保存的时候才会真正的自该磁盘的分区。
子命令:
p 分区列表
t 更改分区类型
n 创建分区
d 删除分区
w 保存并退出
q 不保存退出
m 查看帮助,打印菜单选择项
在修改分区完成之后,可查看内核是否已经识别新的分区 cat /proc/partations
如果内核没有识别到新的分区,可通过命令是内核重新读取硬盘分区表
在 centos 6 上 partx -a -n M:N /dev/DEVICE 或者 kpartx -a /dev/DEVICE
删除分区:partx -d -n M:N /dev/DEVICE
在centos 5,7上面直接使用partprobe 就可以了 partprobe [/dev/DEVICE]

文件系统:

查看当前系统支持的文件系统 cat /proc/filesystems
创建文件系统
    mkfs.fs_type /dev/DEVICE
        fs_type: ext# xfs btrfs vfat...
    mkfs -t fs_type /dev/DEVICE
创建ext文件系统
mke2fs:ext系列文件系统专用管理工具
    -t ext#
    -b {1024|2048|4096}
    -L 'lable'
    -j: 加日志记录 相当于-t ext3
    -i #:为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小
    -N #:为数据空间创建多少个inode
    -I 一个inode记录大小 128--4096
    -m #:默认5% 位管理人员预留空间占总空间的百分比
文件系统标签:
    blkid [options]...[device]块设备属性信息查看
    -U UUID:根据指定的UUID来查找对应的设备
    -L LABLE:根据指定的lable来查找
    e2lable:管理ext系列文件系统的lable   eg e2labl device [lable]
    findfs:查找分区
        findfs [options] LABLE=<lable>
        findfs [options] UUID=<uuid>
tune2fs:重新设定ext系列文件系统可调整参数的值
    -l:查看指定文件系统超级块信息:super block
    -L 'LABLE' 修改卷标
    -m #:默认5% 位管理人员预留空间占总空间的百分比
    -j 将ext2升级为ext3
    -U UUID修改
dumpe2fs -h  查看你超级块信息,不显示分组信息

文件系统检测和修复

常发生于死机或者非正常关机之后
挂在为文件系统标记为 No clean
注意:不要在挂载状态下修复
修复命令工具:
fsck:file system check
fsck.fs_type
fsck -t fs_type
    -a :自动修复错误
    -f :交互式修复错误
e2fsck:ext系列文件专用的检测修复工具
-y:自动回答yes
-f:强制修复

挂载mount

挂载mount:将额外文件系统与根文件系统某现存的目录建立起关联关系,从而使得此目录作为其他文件访问入口的行为.
卸载unmount:接触挂载关系,进程正在使用中的设备无法被卸载
挂载点目录一般为空,如果有文件,则挂载后原文件在挂载完成后倍临时隐藏
通过查看/etc/mtab 文件显示当前已挂载的所有设备
mount [-fnrsvw] [-t vfstype] device mount_point
    -v vfstype:指定要挂载的设备上的文件系统类型
    -r: readonly,只读挂载
    -w:read and write,读写挂载
    -n:不更新/etc/mtab
    -a:自动挂载所有支持自动挂载的设备(定义在/etc/fstab文件中,且挂载选项中有auto功能)
    -L 'LABLE'
    -U 'UUID'
    -B,--blind:绑定目录到另一个目录上

cat /proc/mounts 查看内核追踪到的已挂载的所有设备

-o options:(挂载文件系统的选择),多个选择使用逗号分隔
    async:异步模式
    sync:同步模式,内存更改时同时写磁盘
    atime/noatime:包含目录和文件
    diratime/nodiratime:目录访问时间戳
    auto/noauto: 是否支持自动挂载,是否支持 -a选择
    exec/noexec:是否支持在文件系统上运行应用程序
    dev/nodev: 是否支持在此文件系统上使用设备文件
    suid、nosuid:是否支持suid和sgid权限
    remount 重新挂载
    ro:只读   rw:读写
    user、nouser:是否允许普通用户挂载次设备,默认管理员才能挂载
    acl:启用次文件系统上的acl功能
    default:相当于rw,nosuid,dev,exec,auto,nouser,async

findmnt mount_point 查看挂载情况
查看正在访问指定文件系统的进程:

lsof mount_point    
fuser -v mount_point

终止所有正在访问指定的文件系统的进程:
fuser -km mount_point
卸载 umount device 或者 umount mount_point

文件挂载配置文件 /etc/fstab

1
2
3
4
5
6
1、要挂载的设备或伪文件系统:设备文件、lable(LABLE="")、UUID(UUID="")、伪文件系统名称(proc、sysfs)
2、挂载点:
3、文件系统类型
4、挂载选项:defaults,acl ...
5、转储频率:0,不做备份。1、每天转储。2、每隔一天转储
6、自检次序:0、不自检。1、首先自检,一般只有rootfs才用1
创建ISO文件
cp /dev/cdrom /root/centos7.iso
mkisofs -r -o /root/etc.iso /etc 
刻录光盘
wodim -v -eject centos.iso 

常见工具命令
free [option]   -m :以M为单位   -g :以GB为单位
df [option]...[file]...
    -H:以1000为单位
    -T:文件系统类型
    -h:human readable
    -i:inodes instead of block 
    -p:以posix 兼容的格式输出

du [option]...dir 
-h :human readable
-s :summary

dd if=/path/from/src of=/path/to/dest
bs=# :block size ,复制单元大小
count=# :复制多少个bs
of=file 写到所命名的文件
if=file  从file文件读取
bs=size     指定块大小(即使ibs也是obs)
ibs=size    一次读取size个byte
obs=size    一次写size个byte
cbs=size    一次转化size个byte
skip=blocks     从开头忽略blocks个ibs大小的快
seek=blocks     从开头忽略blocks个obs大小的快
count=n         只拷贝n个记录
conv=conversion[,conversion...]     用指定的参数转换文件,转换参数如下:
    ascii  转换ebcdic为ascii
    ebcdic 转换ascii为ebcdic
    block 转换一行数据为度为cbs的记录,不足部分用空格填充
    unblock 替代cbs长度的每一行尾的空格为新行
    lcase 吧大写字符转换为小写字符
    ucase 吧小写字符转换为大写字符
    nocreat 不创建输出文件
    noerror 出错时不停止
    notrunc 不截短输出文件
    sync 把每个输出块填充到ibs个字节,不足部分用空字符补齐

备份MBR: dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

Linux压缩和解压

[TOC]

在Linux系统中压缩、解压以及归档的工具主要有一下几种:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
file-roller : 这个工具适合在桌面系统下进行解压操作。
compress/uncompress :这是一个比较老的解压工具,压缩后会添加.Z为后缀
gzip/gunzip : .gz结尾
bzip2/bunzip2 : .bz2
xz/unxz : .xz
zip/unzip .zip
tar
cpio

主要命令参数介绍
compress [-dvc] [file...]
-d: 解压,相当于uncompress
-c: 解压结果标准输出,不删除源文件
-v: 显示详情
zcat file.Z -->不解压的情况下查看文件
zcat file.Z >file -->解压保留源文件

gzip [-dc#] file...
-d:解压缩 =gunzip
-c:标准输出
-#:1-9,指定压缩比,默认为6
zcat file.gz -->不解压的情况下查看文件
zcat file.gz >file -->解压保留源文件

bzip2 [-kd#] file...
-k:keep,即保留源文件
-d:解压缩=bunzip2
-#:指定压缩比,默认6
bzcat :不解压下查看文件内容

xz [-kd#] file...
-k:keep,即保留源文件
-d:解压缩=unxz
-#:指定压缩比,默认6
xzcat :不解压下查看文件内容

zip
-r : 递归压缩,文件及目录
zip –r /testdir/sysconfig.zip /etc/sysconfig/ ...
-d :删除压缩文件中指定的文件
-m :添加
zip -d myfile.zip old.txt
zip -m myfile.zip new.txt
unzip -p message.zip > message

tar [] tape archive 磁带 归档
-c create
-f file.tar
-v 可视化
-x 解包
-r add追加
-t 预览文件名
-C 展开到指定目录
-z 归档后压缩成 .tar.gz
-j .tar.bz2
-J .tar.xz
-T 指定输入文件
-X 指定要排除文件
常用组合
tar -cvf archive.tar file ... 归档
tar -tvf archive.tar 查看归档文件名列表
tar -xvf archive.tar 解包

cpio: copy input output,可解压以.cpio 或者.tar结尾的文件
cpio [option] > file or devicename
cpio [option] < file.cpio or devicename
-o :打包生成file.cpio
-i :从cpio中解包
-t :预览文件名
-v :显示过程
-d :解包生成目录
常用组合
find ./etc |cpio -ov > etc.cpio
cpio -tv < etc.cpio
cpio -iv < etc.cpio
cpio -idv < etc.cpio

Linux程序包管理器

[TOC]

源代码命名方式,name-version.tar.gz|bz2|xz, –>version:major.minor.release
要将一个源代码程序安装到Linux系统上,一般有两个方法。

1.找到源代码,手动编译安装。解压,./configure  --> make --> make install
2.使用软件包管理器(程序包管理器)
3.直接解压做好的二进制包后使用

1.程序包管理器:

将编译好的应用程序文件打包成一个或者几个,从而方便快捷的实现程序包的安装,卸载,查询,升级和校验等管理操作。

Linux系统不同版本有不同的程序包管理器。目前主要分两类
1、debian:deb文件,dpkg包管理器
2、RedHat:rpm文件,rpm包管理器,RPM:RedHat package manager(原名),现在已是 RPM package manager 递归缩写

2.RPM包命名方式:

name-version-release.arch.rpm   -->version:major.minor.release  -->release:release.os
eg:bash-4.2.46-19.el7.x86_64.rpm
常见arch:x86,x86_64,PowerPC 或者noarch()

3.RPM包的分类和拆包

Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm开发子包
Application-utils-VERSION-ARHC.rpm其它子包
Application-libs-VERSION-ARHC.rpm其它子包
包与包之间可能存在依赖关系,甚至循环依赖。解决方法:yum(RedHat,centos)

4.RPM包文件组成

a、RPM包内的文件。 b、RPM包的元数据,如名称,版本,依赖性,描述等。 c、安装或者卸载时运行的脚本。

5.获取程序包的途径方法:

1、系统发版的光盘或者官方服务器;
    CentOS镜像
    http:www.centos.org/download/
    http://mirror.aliyun.com(阿里云) 搜狐 163等
2、项目官方站点
3、第三方组织
    Fedora-EPEL:
    Extra Packages for Enterprise Linux
    Rpmforge:RHEL推荐,包很全
    搜索引擎:
    http://pkgs.org
    http://rpmfind.net
    http://rpm.pbone.net
    https://sourceforge.net/
4、自己制作
    注意:非官方下载的程序包要检查其合法性:来源的合法以及程序包的完整性

6.库文件

程序的运行需要依赖库文件 ldd /path/to/binary_file 可以查看二进制程序所依赖的库文件
库文件的配置文件:/etc/ld.so.conf /etc/ld.so.conf.d/*.conf   即ld.so.conf 文件和 /etc/ld.so.conf.d/ 目录下所有以 .conf结尾的文件

Linux安装命令rpm的使用

[TOC]

rpm命令,安装(-i,–install)、卸载、升级(-U,-F)、查询(-q,–query)、校验(-V,–verify)、数据库维护

1.安装:

rpm {-i|--install} [install-options] PACKAGE_FILE…
v:可视化
h:以#显示进度
rpm -ivh package_file

[install-options]
--test:测试安装
--nodeps:忽略依赖关系
--replacepkgs |replacefiles
--nosignalture:不检查来源合法性
--noscripts:不执行程序包脚本
    --nopre,--nopost,--nopreun,--nopostun 安装前后,卸载前后

2.查询:

rpm {-q|--query} [select-options][query-options]
[select-options]
-a:所有包
-f:查看指定文件有那个程序安装包生成
-p rpmfile:正对尚未安装的程序包做查询操作
--whatprovides capability:查看指定的capability由哪个包所提供

3.卸载:

rpm {-e|--erase} [--allmatches][--nodeps] [--noscripts][--notriggers] [--test] PACKAGE_NAME ...

4.包校验:

rpm {-V|--verify} [select-options][verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTimediffers
P capabilities differ

5.导入所需要公钥:

rpm -K|checksig  rpmfile检查包的完整性和签名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
rpm -qagpg-pubkey*

6.常用

1
2
3
4
rpm -ivh package_file
rpm -ql app_name
rpm -qf file
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7