2021年2月

将Linux主机接入网络需要配置:

  1. ip/netmask
  2. 默认网关
  3. dns服务器

静态指定

ifcfg:ifconfig\route\netstat

ip:ip\link\route\ss

修改/etc/sysyconfig/network-script/

centos7:nmcli

ifconfig(net-tools)

ifconfig -a:查看所有网络接口的配置信息

ifconfig 接口 [up|down]:启用或关闭网络接口
ifconfig ens33 down

ifconfig 接口 x.x.x.x/24 [up]
/ifconfig 接口 x.x.x.x. netmask x.x.x.x :配置ip地址

ifconfig ens33 192.168.226.111/24 up

混杂模式:抓取所有经过的报文,即使该报文不是发给该接口的

ifconfig 接口 promisc(开启)-promisc(关闭)

route

查看内核路由表信息

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens33
192.168.226.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.226.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
目的地          网关            子网掩码        标志位  度量值             接口

度量值:
U:启用状态
G:默认网关
H:主机路由

0.0.0.0表示任何地方

添加路由

route add/del [-net] [-host] [netmask] [gw] [dev]

-net:表示后面接的路由为一个网域

-host:表示后面接的为连接到单部主机的路由

netmask:子网掩码

gw:网关

dev:指定由哪一块网卡连线出去

主机路由
route add -host 192.168.1.1 gw 192.168.88.8 dev ens33
网络路由
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.226.8 dev ens33
默认路由
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1
删除
route del .........

dns服务器指定

/etc/resolv.conf

[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.226.2
nameserver 114.114.114.114

dns解析工具yum install -y bind-utils

nslookup

[root@localhost ~]# nslookup
> baidu.com
Server:        192.168.226.2
Address:    192.168.226.2#53

其他用法和其他工具

netstat

netstat命令:查看网络连接状态

网络连接 路由表信息 接口统计 伪装连接 组播成员关系

常用参数:

-t : 显示tcp协议相关
-u :显示udp协议相关 
-w :显示raw socket相关(混在模式收到的相关数据包)
-l :显示处于Listen状态连接
-a :显示所有状态的连接
-n :以数字显示IP地址和端口号
-p :显示相关进程及PID 
-e :扩展格式显示

netstat -tnap

显示路由表:
netstat -r:显示内核路由表
netstat -n 数字格式(不反向解析

显示接口的统计数据

显示所有接口:netstat -i

显示指定接口:netstat -I接口

ifup/ifdown开关接口

ip

ip link:网络设备配置

ip link set [interface]

[up|down]  激活或禁用指定端口
multicast [on| off]  开启或关闭接口组播功能
name <N_name>  重名命接口
mtu <M_value>  设置MTU值
netns [PID|Name]  将接口移至指定的命名空间中

ip link show 显示所有接口信息

ip link show 显示指定接口信息

ip link show up 仅显示处于up状态的接口

ip address: 协议地址管理

ip address show 查看所有设备IP地址信息

dev <interface> 查看指定设备的IP地址信息
label <interface:>  查看指定设备的标签
dev <interface> primary 查看指定设备主IP 

ip address [add | del] IPADRESS dev

ip address add x.x.x.x/x dev ens32 [broadcase x.x.x.x  | label ens32:1]   配置IP地址 
ip address add x.x.x.x/x dev ens32 scope [global|link|host]  指定作用域
    global 全局可用
    link 仅链接可用(同一广播域通信)
    host 本机可用(只能跟自己通信)

ip address flush dev 清空指定设备的所有IP地址

ip route:网络路由配置

ip route add

x.x.x.x/x via x.x.x.x dev <interface>  网络路由
x.x.x.x via x.x.x.x dev <interface> 主机路由 
default x.x.x.x/x via x.x.x.x dev <interface>  默认路由 
    src x.x.x.x  添加路由时可以指定源IP地址

ip route change|replace x.x.x.x/x via x.x.x.x

dev 修改路由信息

ip route delete x.x.x.x/x 删除指定路由

ip route show 查看路由信息

ip route get x.x.x.x/x 查看指定路由相信信息

ip route flush 清空所有路由

ip route flush x.x.x.x 清空指定路由

ss

ss命令: 显现socket连接状态

常用参数:

-t: tcp 
-u: udp 
-w:raw socket 
-x: unix socket 
-l: Listen
-a: all 
-n: number形式
-p: Pid 
-m: memory 
-o: timer
-e: 扩展格式 



网络配置文件

`[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp dhcp\none\static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=7b792800-d238-47ec-bfd8-ccb55d6cd1b1
DEVICE=ens33
ONBOOT=yes 开机自启

将其修改成静态

添加
IPADDR0=192.168.226.100
NETMASK0=255.255.255.0
GATEWAY0=192.168.226.2 自己的主机一般是1,虚拟机一般是2
DNS1=114.114.114.114

重启网络服务
systemctl restart network


# 修改当前主机的主机名:

  hostname [HOSTNAME] 临时修改 

hostnamectl set-hostname <Hostname> 永久修改

配置文件:/etc/sysconfig/network :HOSTNAME=New_Name

主机名解析:/etc/hosts

systemd用于启动守护进程,是系统的第一个进程,PID为1

systemctl

systemctl command name.service

常用命令
启动:start
停止:stop
重启:restart
状态:status
重载或重启:reload-or-restart
条件式重启:try-restart
禁止设定为开机自启:mask
取消禁止开机自启:unmask
自启:enable
禁止:disable
查看是否激活:is-active
查看已经激活的服务list-units --type service
查看所有服务开机自启状态:list-unit-files --type service

切换至紧急救援模式:rescue

切换至emergency模式:emergency

chkconfig

查看是否开机启动chkconfig --list name
设定服务自启动:chkconfig name on
禁止:chkconfig name off
查看所有服务开机自启状态chkconfig --list

其他systemd命令

Linux进程管理

进程优先级PRI:越接近100优先级越高,低于一百为实时优先级,高于为静态优先级

静态优先级内核不会主动修改,只能通过系统调用nice去修改

实时优先级只对实时进程有效

Nice值NI:(-20,19)值越低表示优先级越高,一般情况下子进程会继承父进程的nice值

各值详细解释

进程类型:

守护进程:系统引导过程中启动的进程,与终端无关

前台进程:跟终端有关,通过终端启动的进程

进程状态:

运行态:running

就绪态:ready

睡眠态:interruptable(可中断)
/uninterruptable(不可中断)

停止态:stopped暂停与内存,但不会被调度

僵死态:zombie

**Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

进程管理工具

pstree

ps

常用组合: aux\ef

aux:

u:以用户为中心组织进程状态关系显示

a:与终端相关的进程

x:与终端无关的进程

[root@localhost ~]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
用户 进程ID CPU占用 内存占用 
VSZ:Virtual memory SiZe 虚拟内存集 
RSS:ReSident Size 常驻内存集———其他的都可以放入交换内存中
STAT:进程状态 
R:running 
S:interruptable sleeping 
D:uninterruptable sleeping 
T:stopped 
Z:zombie 
+:前台进程 
l:多线程进程 
N:低优先级进程 
<:高优先级进程 
s:session leader 
START:启动时间 
TIME:运行占据cpu的累积时长 COMMAND:由哪个命令来启动的相关进程

ef
:
e:显示所有进程

f:显示完整格式程序信息

top

top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]

-d:每隔几秒刷新一次,默认3s

-p指定特定的pid进程观察

top按键

?:输出可用命令

排序

P:以CPU使用资源进行排序

M:以内存使用资源排序

T:累积占据CPU时长

首部信息

uptime信息:l命令

task及cpu信息:t命令

cpu分别显示:1(数字)

memory信息:m命令

退出命令:q

修改刷新时间间隔:s

终止指定进程:k
T0CJ~I1ZB8Q{X~B66MS8([6.png

htop彩色版
![TR0J3VJ4D6FL)(CHZ]Y%21D.png][2]

kill

-l:显示可用信号

kill [-sign] PID

killall [-sign] program 终止名称下所有进程

常用信号

SIGHUP:无需关闭进程而让其重读配置文件 1

SIGINT:自动捕捉ctrl+c信号来种植正在运行的进程 2

SIGKILL:杀死进程 9

SIGTERM:终止进程 15 可以被阻塞、忽略、处理

nice/renice

进程优先级调整,进程默认启动时nice为0,优先级为120

Linux计划任务

at

at -f time job

time :

HH:MM[YY-mm-dd]

moon,midnight,tommorrow,now + #[min,hours,seconds]

例子

at now +1 minutes -f test1.txt

atq查看当前的任务队列

crond定时任务

Linux上非常多的计划任务使用crond方式,crond服务开机自启,用户可以用crontab来自定义计划

注意,使用date查看自己系统当前的时间是否一致,如不一致,可以使用date -s 进行修改,修改后使用clock -w保存

/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
分钟 小时 日 月 星期 用户 任务


使用*表示“每”

1: root用户在每天晚上9.30执行指定任务
30 21 * * * root echo "hello"

2:root用户在每周一周五晚上8点执行执行任务

0 20 * * mon,fri root echo "hello"

3:zhangsan用户在每个月1-9晚上8点执行任务

0 20 1-9 * * zhangsan echo "到点了"

使用/#表示指定步长

* */3 * * * zhangsan echo.sh         # 每3小时执行一次
crontab -e 创建新的计划
-r 移除任务
-l 列出任务列表
-u 指定执行用户


只保留7天内的日志(使用计划任务在每天0点删除7天前的日志即可)
* * * * * find /var/log/java/*.log -atime 7 -delete | -exec rm -rf {}\;

-exec rm -rf {} + 用于对搜索到的文件执行相应的操作,其中{}表示搜索到的文件路径。{}后面可以接空格加号或空格反斜线分号。

备份: 备份指定数据/mydata/
10 0 * * * tar -czxf /backup/mydata.zip.tar /mydata/ 

通配符

用于shell做路径匹配,一般配合find,ls,cp,mv等作文件名匹配

*:匹配任意多个字符
?:匹配一个
[list]:匹配list中任意单个字符
[c1-c2]:匹配c1-c2中任意单个字符
[^c1-c2]/[!c1-c2]:不匹配
{st1,st2....}:匹配任意单个字符串

shell元字符

字符说明
IFS 三者之一组成(我们常用 space )。
CR 产生。
=设定变量。
$作变量或运算替换
>重导向 stdout。
<重导向 stdin。
命令管线。
&重导向 file descriptor ,或将命令置于背境执行。
( )将其内的命令置于 nested subshell 执行,或用于运算或命令替换。
{ }将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。
;在前一个命令结束时,而忽略其返回值,继续执行下一个命令。
&&在前一个命令结束时,若返回值为 true,继续执行下一个命令(echo $?如果为0则上一条命令执行成功)
丨丨在前一个命令结束时,若返回值为 false,继续执行下一个命令。
!执行 history 列表中的命令。

转义

'':硬转义,里面所有的转义都会失效被当作字符串处理
"":软转义,转义会生效

正则

##字符匹配 
    .:匹配任意单个字符 
    []:匹配指定范围内任意单个字符 
    [^]:匹配指定范围外任意单个字符 
    [:alnum:]:字母与数字字符 
    [:alpha:]:字母 
    [:blank:]:空格或制表符 
    [:cntrl:]:ASCII控制字符 
    [:digit:]:数字 
    [:graph:]:非控制、非空格字符 
    [:lower:]:小写字母 
    [:print:]:可打印字符 
    [:punct:]:标点符号字符 
    [:space:]:空白字符,包括垂直制表符 
    [:upper:]:大写字母 
    [:xdigit:]:十六进制数字 

##匹配次数 
    *:匹配前面的字符任意次数 
    .*:匹配任意长度的字符 
    \?:匹配其前面字符0或1次,即前面的可有可无 
    \+:匹配其前面的字符至少1次 
    \{m\}:匹配前面的字符m次 
    \{m,n\}:匹配前面的字符至少m次,至多n次 
    \{0,n\}:匹配前面的字符至多n次 
    \{m,\}:匹配前面的字符至少m次 

##位置锚定 
    ^:行首锚定,用于模式的最左侧 
    $:行末锚定,用于模式的最右侧 
    ^PATTERN$:用于模式匹配整行; 
    ^$:空行 
    \< 或 \b:词首锚定,用于单词模式的左侧 
    \> 或 \b:词尾锚定,用于单词模式的右侧 
    \<PATTERN\>:匹配整个单词 


##分组
    \(\):将一个或多个字符捆绑在一起;当作一个字符
    \(xy\)*ab 
    Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命令 方式为:
        \1,\2,\3…… 
        \1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符; 
        \(ab\+\(xy\)*\): 
        \1:ab\+\(xy\)* 
        \2:xy

## 扩展

文本三剑客

find

通过遍历指定路径下文件来完成查找,实时精确,速度略慢

find [ ] [ path] [条件 处理]


find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

按文件名

-name:
-iname:忽略大小写

[root@server1 ~]# find / -iname ens*

按大小

-size +/-大小

[root@server1 ~]# find /etc -size +5M
/etc/udev/hwdb.bin

查找目录深度

-maxdepth n
-mindepth n

[root@server1 ~]# find /etc -maxdepth 3 -a -name *ens*
/etc/pki/tls/openssl.cnf
/etc/sysconfig/network-scripts/ifcfg-ens33

按时间

-mtime +/-n 单位为天
-atime
-ctime

[root@server1 ~]# find /root/ -mtime -3

按属主属组

-user
-group
-nouser:没有属主的文件
-nogroup

按权限

-perm [+/-]MODE

/MODE:任何一类对象的权限只要有一位能匹配即可(如/222)
-MODE:每一类对象都必须同时拥有规定的权限

按组合条件

-a:与
-o:或
-not:非

处理动作

-ls:ls -l
-delete:删除
-fls:查到的所有文件的长格式信息保存到指定文件中
-ok cmd {}\:对查到的每个文件执行cmd并交互确认
-exec cmd {} \:对查到的每一个文件执行cmd


[root@server1 ~]# find /etc -size +5M -ls
17243382 7760 -r--r--r--   1 root     root      7942570 1月 12 10:11 /etc/udev/hwdb.bin

find /etc -mtime -3 -exec cp -r {} test/ \;

grep(配合正则)

-E:扩展正则
-i:忽略大小写
-n:打印行号
-o:只打印匹配的内容
-c:只打印每个文件匹配的行数
-v:只打印不匹配的行
-B:--before--context=NUM:只打印匹配的前几行
-A:--after--context=NUM:打印匹配的后几行
-C:--context=NUM:打印匹配的前后几行

实例

[root@server1 test1]# cat t1
saxcs
#fasc
#fesads
#gfxsd
#234Rfa
2134
342fsd

sdf
hrl
casa

忽略大小写

[root@server1 test1]# grep -i 'r' t1
#234Rfa
hrl

过滤空行

[root@server1 test1]# grep -v "^$" t1
saxcs
#fasc
#fesads
#gfxsd
#234Rfa
2134
342fsd
sdf
hrl
casa

过滤以#开头的行

[root@server1 test1]# grep -v "^#" t1
saxcs
2134
342fsd

sdf
hrl
casa

过滤#开头的行和空行

[root@server1 test1]# grep -Ev "^$|^#" t1
saxcs
2134
342fsd
sdf
hrl
casa

打印包括sa的前两行

[root@server1 test1]# grep -B 2 'sa' t1
saxcs
#fasc
#fesads
--
sdf
hrl
casa

只打印sa

[root@server1 test1]# grep -o 'sa' t1
sa
sa
sa

打印包含sa的行

[root@server1 test1]# grep  'sa' t1
saxcs
#fesads
casa

打印且显示行数

[root@server1 test1]# grep  -n 'sa' t1
1:saxcs
3:#fesads
11:casa

正则

1.显示/proc/meminfo文件中以大小s开头的行
grep "^[Ss]" /proc/meminfo 
grep -i "^s" /proc/meminfo

2.显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd

3.如果root用户存在,显示其默认的shell程序  位置锚定
[root@test tmp]# id root > /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

4.找出/etc/passwd中的两位或三位数
(贪婪)
[[:digit:]]\{2,3\}

(非贪婪)
grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd

5.寻找以字母开头,后面内容中存在数字
grep -i "^[[:alpha:]]\+.*[[:digit:]]\+" 2.txt

6.找出成功连接的
grep "\(200\)\?" 1.log

sed

sed是面向流的编辑器

语法

sed的命令格式: sed [option] 'sed command' filename 
sed的脚本格式:sed [option] -f 'sed script' filename 
常用选项: 
-n :只打印模式匹配的行 
-e :直接在命令行模式上进行sed动作编辑,默认选项 
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作 
-r :支持扩展表达式 
-i :直接修改文件内容 ,很危险不建议这样做

查询文本的方式 
使用行号和行号范围 
x:行号 
x,y:从x行到y行 
x,y!:x行到y行之外 
/pattern:查询包含模式的行 
/pattern/, /pattern/:查询包含两个模式的行 
/pattern/,x:x行内查询包含模式的行 
x,/pattern/:x行后查询匹配模式的行

动作

p:打印匹配的行(-n) 
=:显示文件行号 
a\:指定行号后添加新文本 
i\:指定行号前添加新文本 
d:删除定位行 
c\:用新文本替换定位文本 
w filename:写文本到一个文件 
r filename:从另一个文件读文本 
s///:替换 

替换标记: 
g:行内全局替换 
p:显示替换成功的行 
w:将替换成功的结果保存至指定文件 
q:第一个模式匹配后立即退出 
{}:在定位行执行的命令组,用逗号分隔 
g:将模式2粘贴到/pattern n/

实例

在第四行后添加一行

[root@server1 test1]# cat t1
one
two
three
four
five
six
[root@server1 test1]# sed 4a\test t1
one
two
three
four
test
five
six

列出passwd文件内容并打印序号,同时删除2-5行


[root@server1 test1]# nl /etc/passwd | sed 2,5d
     1  root:x:0:0:root:/root:/bin/bash
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    15  dbus:x:81:81:System message bus:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin

添加多行文字

[root@server1 test1]# nl t1 | sed '2a hello\
> nihao'
     1  one
     2  two
hello
nihao
     3  three
     4  four
     5  five
     6  six

替换文本

[root@server1 test1]# nl /etc/passwd | sed '2,5c you cant see that'
     1  root:x:0:0:root:/root:/bin/bash
you cant see that
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    15  dbus:x:81:81:System message bus:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin

只打印筛选出的行

[root@server1 test1]# nl t1 | sed -n 1,3p
     1  one
     2  two
     3  three

搜索

[root@server1 test1]# nl /etc/passwd | sed -n "/root/p"
     1  root:x:0:0:root:/root:/bin/bash
    10  operator:x:11:0:operator:/root:/sbin/nologin

删除查找到的内容并输出其他的

[root@server1 test1]# nl /etc/passwd | sed '/root/d'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    15  dbus:x:81:81:System message bus:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin

查找后执行花括号里的命令,每个命令用分号分隔,先替换再输出

[root@server1 test1]# nl /etc/passwd | sed '/root/{s/bash/nologin/;p;q}'
     1  root:x:0:0:root:/root:/bin/nologin
     1  root:x:0:0:root:/root:/bin/nologin

取ip地址

[root@server1 test1]# ifconfig | sed -n '/netmask/p' | sed 's/^.*inet //g' | sed 's/ netmask.*$//g' | sed -n '1p'
192.168.226.148

多项命令

[root@server1 test1]# nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
     1  root:x:0:0:root:/root:/bin/blueshell
     2  bin:x:1:1:bin:/bin:/sbin/nologin

awk

awk能通过简单的脚本来处理文件,一般来说,awk以文件的一行为处理单位,每接收一行就执行相对应的命令.awk只能用单引号

awk '{pattern + action}' {filenames}

-F指定切割符号,不写默认为空格,$n代表分割后的每一个字段,$0代表一整行。一行就是一个记录,一个记录有若干个字段,NF为字段数量,NR为记录数量,RS为记录分隔符,默认为\n

[root@server1 test1]# awk -F: '{print $0}' t1
one:123:312
two:231:431
three:432:5r13
[root@server1 test1]# awk -F: '{print $1}' t1
one
two
three

常用内置变量

变量名属性
$0当前记录
$n当前记录的第n个字段
FS输入分隔符,默认为空格
RS输入记录分隔符。默认换行符
NF当前记录的字段个数
NR当前读出的记录数
OFS输出字段分隔符,默认空格
ORS输出记录分隔符,默认换行符

awk正则

awk '/REG/{action} ' file

布尔表达式awk '布尔表达式{action}' file

avatar

判断、循环、数组

awk提供了类似c语言的部分语句

if

{
        if ($1=="foo"){
                if($2=="foo"){
                        print "uno"
                }else{
                        print "one"
                }
        }elseif($1=="bar"){
                print "two"
        }else{
                print "three"
        }
}

while

{
    count=1do {
        print "I get printed at least once no matter what"
    } while ( count !=1 )
}

for

for ( initial assignment; comparison; increment ) {
    code block
}

数组

{
    cities[1]=”beijing”
    cities[2]=”shanghai”
    cities[“three”]=”guangzhou”
    for( c in cities) {
        print cities[c]
    }
    print cities[1]
    print cities[“1”]
    print cities[“three”]
}

实例

打印文件的20-30行

[root@server1 test1]# awk '{if(NR >=20 && NR <=30) print $1}' t1

从文本中过滤出姓名和id,以逗号和空格为分隔符,[ ,]+表示空格或者逗号至少出现一次

[root@server1 test1]# awk -F'[ ,]+' '{print $2" "$6}' t1
arisa 123654

统计passwd用户认数(当然此处也可以使用wc -l)

[root@server1 test1]# awk 'BEGIN{line=0}{line++}END{print line}' /etc/passwd
19
#BEGIN和END在开始和结束的时候会执行一次,中间的代码每取出一个记录会执行一次

统计目录下文件的总大小

[root@server1 test1]# ll /root
总用量 4
-rw-------. 1 root root 1241 1月  12 10:11 anaconda-ks.cfg
drwxr-xr-x. 3 root root   29 2月  18 19:48 test
[root@server1 test1]# ll | awk 'BEGIN{size=0}{size +=$5}END{print size} '
30

统计内存占有率大于0.1的进程,并把相关信息保存到文件当中

[root@server1 test1]# ps -aux| grep -v USER|awk '{if($4>0.1)print$2,$11}' > t1
[root@server1 test1]# cat t1
1 /usr/lib/systemd/systemd
3141 /usr/lib/systemd/systemd-journald
3169 /usr/lib/systemd/systemd-udevd
3170 /usr/sbin/lvmetad
6259 /usr/lib/polkit-1/polkitd
6262 /usr/bin/dbus-daemon
6269 /usr/sbin/NetworkManager
6558 /usr/sbin/sshd
6559 /usr/bin/python2
6561 /usr/sbin/rsyslogd
6644 /usr/libexec/postfix/master
6646 qmgr
6827 sshd:
6831 sshd:
6835 -bash
6850 /usr/libexec/openssh/sftp-server
9132 /sbin/dhclient
9315 pickup

取ip


[root@server1 test1]# ifconfig|awk '{if(NR==2)print$2}'

判断服务器上用户的类型

 awk -F: '{if($3==0) print"root"}{ if($3>0 && $3< 1000) print"系统用户"}{ if($3>=1000) print"普通用户"}' /etc/passwd

筛选出含有root的行

[root@server1 test1]# awk '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

用户为root的行

[root@server1 test1]# awk -F: '$1=="root"{print$0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

统计/etc/fstab/文件中每个文件类型出现的次数

awk '/^UUID/{fs[$3]++}END{for(i in fs){print i,fs[i]}}' /etc/fstab