Linux常用命令(五)

15 Linux 性能优化

15.1 关闭不必要的服务

15.1.1 使用ntsysv命令查看开启与关闭的服务

停止打印服务

# /etc/init.d/cups  stop d

# chkconfig  cups o ff

15.1.2关闭IP6

# vim /etc/modprobe.conf

在下面添加一下配置:

alias net-pf-10  off

alias  ipv6  off

15.2调整文件最大的打开数

15.2.1修改临时配置

查看当前的文件的数量:

# ulimit -n

1024

# ulimit -n 1000000

# ulimit -n

1000000

15.2.2修改永久配置

# vi /etc/security/limits.conf 在文件最后加上:

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

15.3 修改 linux 内核参数

# vi /etc/sysctl.conf

在文本的最后追加一下内容:

net.core.somaxconn = 32768

 

表示物理内存使用到 90%(100-10=90)的时候才使用 swap 交换区

15.4关闭 noatime

在最后追加一下内容

/dev/sda2 /data ext3 noatime,nodiratime 0 0

15.5调节网络传送的数据包MTU

MTU是Maximum Transmission Unit的缩写。意思是网络上传送的最大数据包。

查看:# cat /sys/class/net/eth0/mtu

设置:# echo "1460" > /sys/class/net/eth0/mtu

15.6 在系统方面调节最大连接数(somaxconn)

# more /proc/sys/net/core/somaxconn

128

#  echo 50000 > /proc/sys/net/core/somaxconn

# more /proc/sys/net/core/somaxconn

50000

15.7 加快TCP链接的回收(Recycle)

# more  /proc/sys/net/ipv4/tcp_tw_recycle

0

# cd   /proc/sys/net/ipv4/

#  echo  1 > tcp_tw_recycle

# more  /proc/sys/net/ipv4/tcp_tw_recycle

1

15.8空的tcp是否允许回收利用(Reuse)

# cd   /proc/sys/net/ipv4

# more  /proc/sys/net/ipv4/tcp_tw_reuse

0

 

# echo  1 > tcp_tw_reuse

# more  /proc/sys/net/ipv4/tcp_tw_reuse

1

16 系统出现异常排查思路

16.1 查看用户信息

16.1.1查看当前的用户

# who

 04:39:39 up  1:30,  1 user,  load average: 0.01, 0.01, 0.00

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    192.168.215.1    04:27    0.00s  0.16s  0.02s w

 

16.1.2查看最近登录的用户

# last

***************

root     pts/2        hadoop2          Sun Oct 16 15:52 - 15:52  (00:00)    

root     pts/1        192.168.215.1    Sun Oct 16 15:39 - down   (00:23)    

hadoop  pts/0        :0.0             Sun Oct 16 00:33 - down   (15:30)    

hadoop  tty1         :0               Sun Oct 16 00:31 - down   (15:31)    

reboot   system boot  2.6.32-573.el6.x Sun Oct 16 08:16 - 16:03  (07:47)

 

16.2 查看直线执行的命令

# history

***************

  683  last

  684  clear

  685  last

  686  clear

  687  history

16.3查看现在运行的进程

# pstree -a

init

  ├─NetworkManager --pid-file=/var/run/NetworkManager/NetworkManager.pid

  ├─abrtd

  ├─acpid

  ├─atd

  ├─auditd

  │   └─{auditd}

  ├─bonobo-activati --ac-activate --ior-output-fd=12

*******************

 

# ps  aux

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root          1  0.0  0.0  19352  1544 ?        Ss   03:09   0:02 /sbin/init

root          2  0.0  0.0      0     0 ?        S    03:09   0:00 [kthreadd]

root          3  0.0  0.0      0     0 ?        S    03:09   0:00 [migration/0]

root          4  0.0  0.0      0     0 ?        S    03:09   0:00 [ksoftirqd/0]

root          5  0.0  0.0      0     0 ?        S    03:09   0:00 [stopper/0]

 

16.4查看网络服务的进程

16.4.1查看正在运行的端口

# netstat  -nltl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State      

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      

tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN      

tcp        0      0 :::2181                     :::*                        LISTEN      

tcp        0      0 :::37129                    :::*                        LISTEN      

16.4.2正在活跃的端口

# netstat  -nulp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   

udp        0      0 0.0.0.0:631                 0.0.0.0:*                               2089/cupsd

16.4.3 查看UNIX活跃的端口

#  netstat -nxlp

Active UNIX domain sockets (only servers)

Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path

unix  2      [ ACC ]     STREAM     LISTENING     13954  2136/hald           @/var/run/hald/dbus-WAkpL6y5o7

unix  2      [ ACC ]     STREAM     LISTENING     16245  2614/gnome-session  @/tmp/.ICE-unix/2614

unix  2      [ ACC ]     STREAM     LISTENING     15966  2524/Xorg           @/tmp/.X11-unix/X0

unix  2      [ ACC ]     STREAM     LISTENING     13947  2136/hald           @/var/run/hald/dbus-QUMwKtSaJ5

unix  2      [ ACC ]     STREAM     LISTENING     13818  2089/cupsd          /var/run/cups/cups.sock

*********************

 

16.5查看CPU与内存

16.5.1查看空闲的内存以及内存与硬盘之间的SWAP

# free -m

             total       used       free     shared    buffers     cached

Mem:          1862        475       1386          1         27        202

-/+ buffers/cache:        245       1616

Swap:         2047          0       2047

 

# free -g

              总计         已用        空闲      共享    缓冲/缓存    可用

内存:          15           7           1           0           6           6

交换:           1           0           1

16.6查看运行的详细信息

# uptime

04:59:59 up  1:50,  1 user,  load average: 0.00, 0.00, 0.00

当前时间 04:59:59

系统已运行的时间 1:50

当前在线用户 1 user

平均负载:0.00, 0.00, 0.00,最近1分钟、5分钟、15分钟系统的负载

16.7动态查看运行的内存,CPU等信息

 

P:按%CPU使用率排行

T:按MITE+排行

M:按%MEM排行

 

# top

top - 12:26:46 up 16:21,  1 user,  load average: 0.00, 0.00, 0.00

Tasks:  82 total,   1 running,  81 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.0%us,  0.1%sy,  0.0%ni, 99.7%id,  0.1%wa,  0.0%hi,  0.1%si,  0.0%st

Mem:   1895288k total,   665188k used,  1230100k free,    20628k buffers

Swap:  2097144k total,        0k used,  2097144k free,    80392k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                         

  2269 root      20   0 15056 1080  832 R  2.0  0.1   0:00.01 top                                                                                                                              

     1 root      20   0 19356 1536 1228 S  0.0  0.1   0:01.81 init                                                                                                                             

     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                                                                                         

     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                                                                      

     4 root      20   0     0    0    0 S  0.0  0.0   0:01.13 ksoftirqd/0                                                                                                                      

     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                                                                      

     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.14 watchdog/0                                                                                                                       

     7 root      20   0     0    0    0 S  0.0  0.0   0:41.30 events/0                                                                                                                         

     8 root      20   0     0    0    0 S  0.0  0.0   0:00.00 cgroup                                                                                                                           

     9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper

***********************

16.8 硬件信息

16.8.1系统中所有PCI总线设备或连接到该总线上的所有设备

# lspci

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)

00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)

00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)

00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)

00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)

16.8.2查看硬件方面的信息

# ethtool eth0

*******************

Handle 0x0229, DMI type 33, 31 bytes

64-bit Memory Error Information

Type: OK

Granularity: Unknown

Operation: Unknown

Vendor Syndrome: Unknown

Memory Array Address: Unknown

Device Address: Unknown

Resolution: Unknown

 

Handle 0x022A, DMI type 126, 4 bytes

Inactive

 

Handle 0x022B, DMI type 127, 4 bytes

End Of Table

 

16.9 IO的性能

16.9.1 查看磁盘的使用情况

# iostat

Linux 2.6.32-573.el6.x86_64 (hadoop1) 10/21/2016 _x86_64_ (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.17    0.00    0.56    2.15    0.00   97.11

 

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda               1.49        75.27        10.68     645224      91568

16.9.2 动态的查看服务器的状态值

# vmstat 2 10

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 0  0      0 1322196  30688 298892    0    0    37     5   39   57  0  1 97  2  0

 0  0      0 1322140  30688 298920    0    0     0     0   57   84  1  1 99  0  0

*********************

16.9.3实时的对系统的监控

# mpstat 2 10

Linux 2.6.32-573.el6.x86_64 (hadoop1) 10/21/2016 _x86_64_ (1 CPU)

 

05:37:26 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle

05:37:28 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

05:37:30 AM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.50

05:37:32 AM  all    0.00    0.00    0.00    0.00    0.00    0.50    0.00    0.00   99.50

*********************

 

16.9.4动态显示当前的操作IO的进程

# yum -y install dstat

# dstat --top-io --top-bio

----most-expensive---- ----most-expensive----

     i/o process      |  block i/o process   

bash         53k  316B|init         19k  198B

sshd: root@ 301B  340B|tpvmlpd2      0  4096B

sshd: root@ 136B  180B|jbd2/sda2-8   0    56k

16.10文件系统以及外接磁盘的信息

16.10.1查看当前的挂在的设备

# mount

/dev/sda2 on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")

/dev/sda1 on /boot type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)

16.10.2查看是否有专用的文件系统

打开一下文件进行编辑

# cat /etc/fstab

 

#

# /etc/fstab

# Created by anaconda on Sun Oct 16 07:55:57 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=b89c0aae-3284-4835-9b1b-04986146cd96 /                       ext4    defaults        1 1

UUID=a1313d92-6873-402d-95a6-add6cd1321c6 /boot                   ext4    defaults        1 2

UUID=6a5cde98-2fc5-4d8f-976c-92acb39ab2a9 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

16.10.3查看文件系统的挂在的选项

# vgs

16.10.4查看物理卷的信息

# pvs

16.11查看磁盘的剩余情况

# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2        18G  6.2G   11G  38% /

tmpfs           932M   72K  932M   1% /dev/shm

/dev/sda1       283M   41M  228M  16% /boot

16.12列出当前系统打开文件的工具

# lsof +D / /* beware not to kill your box */

 

***************

lsof      3907      root  mem    REG                8,2     22536     265965 /lib64/libdl-2.12.so

lsof      3907      root  mem    REG                8,2   1926480     265960 /lib64/libc-2.12.so

lsof      3907      root  mem    REG                8,2    124624     265966 /lib64/libselinux.so.1

lsof      3907      root  mem    REG                8,2  99158576     394281 /usr/lib/locale/locale-archive

 

16.12 内核与网络

16.12.1显示在/proc/sys目录中的内核参数

**************

net.ipv6.nf_conntrack_frag6_high_thresh = 4194304

net.ipv6.ip6frag_secret_interval = 600

net.ipv6.mld_max_msf = 64

net.nf_conntrack_max = 65536

net.unix.max_dgram_qlen = 10

abi.vsyscall32 = 1

crypto.fips_enabled = 0

16.12.2 显示设备的详细信息

irq的序号, 在各自cpu上发生中断的次数,可编程中断控制器,设备名称(request_irq的dev_name字段)

# cat /proc/interrupts

            CPU0       

   0:        261   IO-APIC-edge      timer

   1:          8   IO-APIC-edge      i8042

   4:       4838   IO-APIC-edge    

   8:          1   IO-APIC-edge      rtc0

   9:          0   IO-APIC-fasteoi   acpi

 

查看链接数据库的信息

#  cat /proc/net/ip_conntrack /* may take some time on busy servers */

**************

cat: sys/: Is a directory

cat: tmp/: Is a directory

cat: usr/: Is a directory

cat: var/: Is a directory

16.13查看网络套接字连接情况

# netstat

************

unix  3      [ ]         STREAM     CONNECTED     13648  

unix  3      [ ]         STREAM     CONNECTED     13647  

unix  3      [ ]         DGRAM                    10073  

unix  3      [ ]         DGRAM                    10072  

 

16.14获取socket统计信息

# ss -s

Total: 602 (kernel 610)

TCP:   15 (estab 4, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 8

 

Transport Total     IP        IPv6

*   610       -         -        

RAW   0         0         0        

UDP   1         1         0        

TCP   15        5         10       

INET   16        6         10       

FRAG   0         0         0  

16.15日志消息与内核信息的查看

16.15.1 显示linux内核的环形缓冲区信息

# dmesg  [ tail / less / grep / more  ]

*************

eth0: no IPv6 routers present

lp: driver loaded but no devices found

ppdev: user-space parallel port driver

hrtimer: interrupt took 2588670 ns

16.15.2查看系统报错日志

# less /var/log/messages

Oct 16 08:16:22 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.

Oct 16 08:16:22 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1604" x-info="http://www.rsyslog.com"] start

Oct 16 08:16:22 localhost kernel: Initializing cgroup subsys cpuset

Oct 16 08:16:22 localhost kernel: Initializing cgroup subsys cpu

*************

 

 

ccze 可以把日志的信息进行高亮,它可以用不同颜色高亮日志,协助管理员进行区分和查看分析

# sudo    apt-get install  ccze

# tail -F  /var/log/syslog/| ccze

 

16.15.3 安全信息和系统登录与网络连接的信息

# less /var/log/secure

Oct 16 08:17:06 localhost sshd[8287]: Server listening on 0.0.0.0 port 22.

Oct 16 08:17:06 localhost sshd[8287]: Server listening on :: port 22.

Oct 16 00:22:58 localhost polkitd(authority=local): Registered Authentication Agent for session /org/freedesktop/ConsoleKit/Session1 (system bus name :1.25 [/usr/libexec/polkit-gnome-authentication-agent-1], object path /org/gnome/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)

********************

16.16查看定时的任务

16.16.1查看定时任务的运行频率

# ls /etc/cron* + cat

/etc/cron.daily:

cups  logrotate  makewhatis.cron  mlocate.cron  prelink  readahead.cron  tmpwatch

 

/etc/cron.hourly:

0anacron

 

/etc/cron.monthly:

readahead-monthly.cron

 

/etc/cron.weekly:

16.1.2 查看用户是否执行了隐藏的命令

# for user in $(cat /etc/passwd | cut -f1 -d:); do crontab -l -u $user; done

no crontab for root

no crontab for bin

no crontab for daemon

17 U制作启动盘

17.1 使用ubuntu自带的工具制作

17.1.1查找软件

在安装的软件中搜索以安装的软件,关键字creator即可看到以下图标

 

17.1.2 制作启动盘

 

 

以上创建后便可以直接作为启动盘使用了

 

17.2 win系统制作启动盘

工具下载http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

 

17.2.1 制作启动盘

按照以下的步骤选择镜像文件并插入U盘后会自动发现,点击create创建即可

 

18 Linux 高级命令使用

18.1 查找出占用CPU与内存比较高的进程

18.1.1 查看ps进程

# ps -aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.0  0.1  44128  6620 ?        Ss   10:24   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24

root         2  0.0  0.0      0     0 ?        S    10:24   0:00 [kthreadd]

root         3  0.0  0.0      0     0 ?        S    10:24   0:00 [ksoftirqd/0]

******

18.1.2 查找出占用CPU比较高的进程

# ps  -aux | sort  -rnk 3 | head  -n  5

18.1.3 查找出占用比较高的MEM的进程

# ps  -aux| sort -rnk  4 |head  -n  5

 

18.2 cp高级命令使用

使用cp快速备份文件

# cp docker.install.sh{,_back}

# ls

docker.install.sh  docker.install.sh_back

 

可以看出以上备份了一个*_back文件,节省了时间

18.3 MV高级命令使用

使用mv快速对文件重命令

# mv docker.install.sh{,_sd}

# ls

docker.install.sh_back

18.4 把doc格式的文件转化为unix

18.4.1 说明

使用win编辑好的文件传向linux上时会有特殊的符号,还有linux平台上行不识别doc格式的文件.

18.4.2 安装及查看帮助

18.4.2.1 安装工具

安装工具dos2unix工具包

 

# yum install -y dos2unix

18.4.2.2 查看帮助

# dos2unix --help

dos2unix 6.0.3 (2013-01-25)

Usage: dos2unix [options] [file ...] [-n infile outfile ...]

 -ascii                convert only line breaks (default)

 -iso                  conversion between DOS and ISO-8859-1 character set

   -1252               Use Windows code page 1252 (Western European)

   -437                Use DOS code page 437 (US) (default)

   -850                Use DOS code page 850 (Western European)

   -860                Use DOS code page 860 (Portuguese)

   -863                Use DOS code page 863 (French Canadian)

   -865                Use DOS code page 865 (Nordic)

 -7                    Convert 8 bit characters to 7 bit space

 -c, --convmode        conversion mode

   convmode            ascii, 7bit, iso, mac, default to ascii

 -f, --force           force conversion of binary files

 -h, --help            give this help

 -k, --keepdate        keep output file date

 -L, --license         display software license

 -l, --newline         add additional newline

 -m, --add-bom         add UTF-8 Byte Order Mark

 -n, --newfile         write to new file

   infile              original file in new file mode

   outfile             output file in new file mode

 -o, --oldfile         write to old file

   file ...            files to convert in old file mode

 -q, --quiet           quiet mode, suppress all warnings

                       always on in stdio mode

 -s, --safe            skip binary files (default)

 -F, --follow-symlink  follow symbolic links and convert the targets

 -R, --replace-symlink replace symbolic links with converted files

                       (original target files remain unchanged)

 -S, --skip-symlink    keep symbolic links and targets unchanged (default)

 -V, --version         display version number

18.4.3 替换单个与多个文件

18.4.3.1 替换单个文件

aclocal.m4  是需要替换的文件

 

# dos2unix   aclocal.m4

dos2unix: converting file aclocal.m4 to Unix format ...

18.4.3.2 替换多个文件

一下命令可以替换/home/xiaoxu/greeplum/gpdb文件下的全部文件,*代表所有文件

 

# find /home/xiaoxu/greeplum/gpdb  -name "*" | xargs dos2unix

 

*********************

dos2unix: converting file /home/xiaoxu/greeplum/gpdb/src/tutorial/Makefile to Unix format ...

dos2unix: converting file /home/xiaoxu/greeplum/gpdb/src/tutorial/README to Unix format ...

dos2unix: converting file /home/xiaoxu/greeplum/gpdb/src/tutorial/syscat.source to Unix format ...

dos2unix: converting file /home/xiaoxu/greeplum/gpdb/src/win32.mak to Unix format ...

dos2unix: converting file /home/xiaoxu/greeplum/gpdb/THIRDPARTY to Unix format ...

dos2unix: converting file /home/xiaoxu/greeplum/gpdb/config.log to Unix format ...

18.4.4 命令行替换文件

# sed  -i  's/\r$//g'   aaa.txt

18.5 查看文件中最长的长度并倒叙排序

# cat aaa.txt

aaaaaaa

dwdefefef

cddfe&&&&&fefe&&&&fefscdfddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfffffffffffffffffffffffrrrrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbwwwwwwwwwwwwwwwwwwwwcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccefreggggggggggg

333&&&&&3

sddefefe

wee33

 

 

# awk  '{print NR ":" length($1);}'  aaa.txt  | sort  -t  ":"  -k  2 | head  -n  4

3:251

6:5

1:7

5:8

19 Linux高级问题排查

19.1 网络丢包问题排查

19.1.1 问题描述

在web段请求链接的时候经常会显示链接错误或请求时间过长,在请求过程中走的TCP链接,还需要对TCP了解。

19.1.2 排查方法

19.1.2.1 查看网卡的统计信息

安装ifconfig命令

# yum  install  net-tools  -y

#  ifconfig

enp0s3: flags=4163  mtu 1500

        inet 192.168.31.100  netmask 255.255.255.0  broadcast 192.168.31.255

        inet6 fe80::a00:27ff:fe1a:f5b4  prefixlen 64  scopeid 0x20

        ether 08:00:27:1a:f5:b4  txqueuelen 1000  (Ethernet)

        RX packets 349250  bytes 77199466 (73.6 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 25484  bytes 1974427 (1.8 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

在以上中可以看出网卡已经把错包和丢包的情况全部统计出来了,其中RX packets为接受的包, TX packets发送的包。

 

 

当然你也可以显示详细的统计信息

# ethtool -S enp0s3|grep errors

     rx_errors: 0

     tx_errors: 0

     rx_length_errors: 0

     rx_over_errors: 0

     rx_crc_errors: 0

     rx_frame_errors: 0

     rx_missed_errors: 0

     tx_aborted_errors: 0

     tx_carrier_errors: 0

     tx_fifo_errors: 0

     tx_heartbeat_errors: 0

     tx_window_errors: 0

     rx_long_length_errors: 0

     rx_short_length_errors: 0

     rx_align_errors: 0

     rx_csum_offload_errors: 0

 

如果在以上中看到了errors大于0的值,一般的可以查看网线或网卡等硬件设备出问题了

 

 

19.1.3 分析TCP链接问题

19.1.3.1 TCP介绍

TCP 中两个队列分别是 SYN Queue队列和Accept Queue队列,Accept Queue 就是三次握手成功后等待应用 accept() 连接的队列。如果在web段瞬间有大量的请求进入或者是应用 accept() 取出连接的速度太慢,那么这个队列将会溢出,此时系统会根据 tcp_abort_on_overflow 这个内核参数决定是直接丢弃数据包还是发送 RST 给客户端。反映出来的现象就是前端应用无法建立连接。

19.1.3.2查看当前队列的详细信息

用ss命令查看当前队列的大小

# ss  -lnt| expand

State      Recv-Q  Send-Q        Local Address:Port          Peer Address:Port

LISTEN     0      128                       *:22                       *:*     

LISTEN     0      100               127.0.0.1:25                       *:*     

LISTEN     0      128                      :::22                      :::*     

LISTEN     0      100                     ::1:25                      :::*

 

在以上可以看出当前链接的状态,发送包数与接受包数,以及监控的端口,当 Recv-Q 的值接近于 Send-Q 时,就说明当前已完成队列快溢出了,就说明请求的过多了,一直处于等待处理的状态。

19.1.4提高处理能力

19.1.4.1跳动滑动窗口

为了提升服务器的吞吐能力,我们一般都会优化系统的 TCP 缓冲区大小,查看一下的配置大小

# cat /proc/sys/net/ipv4/tcp_rmem

4096 87380 6291456

 

# cat   /proc/sys/net/ipv4/tcp_wmem

4096 16384 4194304

 

87380 : tcp接收缓冲区的默认值

16384 : tcp 发送缓冲区的默认值

19.1.4.2 tcp 或udp收发缓冲区最大值

# cat /proc/sys/net/core/rmem_max

212992

 

131071 :tcp 或 udp 接收缓冲区最大可设置值的一半

 

 

也就是说调用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);  时rcv_size 如果超过 131071,那么getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等于 131071 * 2 = 262142

 

 

# cat /proc/sys/net/core/wmem_max

212992

 

212992:tcp 或 udp 发送缓冲区最大可设置值得一半。

19.1.4.3 udp收发缓冲区默认值

# cat /proc/sys/net/core/rmem_default   

111616:udp接收缓冲区的默认值

 

# cat /proc/sys/net/core/wmem_default

111616

 

111616:udp发送缓冲区的默认值

19.1.4.4 tcp 或udp收发缓冲区最小值

tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定

tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定

19.1.5参考资料

https://mp.weixin.qq.com/s/dCkA3Pzt6rHheiCk3kvG6w

https://blog.csdn.net/qiaoliang328/article/details/7580555

 

19.2 TIME_WAIT 的那些事

19.2.1 描述

我们知道 TCP 在关闭连接的时候,主动断开的一方将处于 TIME_WAIT 状态,并将持续两倍的 MSL。这个 MSL 在 RFC 793 中的建议是 1 分钟,但是很多系统实现都是 30 秒,所以 TIME_WAIT 的时长也就是 1 分钟。这个参数实在内核中设置的,如果想修改需要重新编译内核参数,查看可以使用ss 来查看 TIME_WAIT 的剩余存活时长(netstat 也可以 -o 参数)

19.2.2 查看TIME_WAIT

$ ss  -nta  -o  state  TIME-WAIT |  cat

Recv-Q Send-Q Local Address:Port               Peer Address:Port              

0      0      192.168.209.14:10050              192.168.203.91:46113               timer:(timewait,358ms,0)

 

 

在以上的参数中可以看出timewait等待的时间为358ms,之后就会被系统回收掉。在一个高性能的系统中,大概会稳定在 200ms 左右,可以通过「ss -int」命令来确认。当然,TCP Timer 除了 TIME_WAIT 这种,还有 KEEPALIVE, ON, OFF 三种类型。

19.2.3 查看KEEPALIVE状态

$ netstat  -otn

 

在以上中可以看出有KEEPALIVE,ON,OFF状态的链接,其中KEEPALIVE并不是代表长连接的意思,而是 TCP 的「保活」机制,当达到这个时间系统便会回收。

 

KEEPALIVE

这里的 keepalive 可并不是长连接的意思,而是 TCP 的「保活」机制。

 

ON

就是 RTO 超时重传时间。

 

OFF

以上三种都不属于。

20 Linux 编程

20.1 常用传值符号

$#  是传给脚本的参数个数

$0  是脚本本身的名字

$1  是传递给该shell脚本的第一个参数

$2  是传递给该shell脚本的第二个参数

$@ 是传给脚本的所有参数的列表

$*  是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个

$$  是脚本运行的当前进程ID号

$?  是显示最后命令的退出状态,0表示没有错误,其他表示有错误

20.2 常用判断符号

20.2.1 字符串判断

str1 = str2      当两个串有相同内容、长度时为真

str1 != str2      当串str1和str2不等时为真

-n str1        当串的长度大于0时为真(串非空)

-z str1        当串的长度为0时为真(空串)

str1         当串str1为非空时为真

20.2.2 数字的判断

int1 -eq int2    两数相等为真

int1 -ne int2    两数不等为真

int1 -gt int2    int1大于int2为真

int1 -ge int2    int1大于等于int2为真

int1 -lt int2    int1小于int2为真

int1 -le int2    int1小于等于int2为真

= 等于               如:if [ “$a” = “$b” ]

== 等于              如:if [ “$a” == “$b”],与=等价

!= 不等于            如:if [ "$a" != "$b" ]

20.2.3 文件的判断

-r file     用户可读为真

-w file     用户可写为真

-x file     用户可执行为真

-f file     文件为正规文件为真

-d file     文件为目录为真

-c file     文件为字符特殊文件为真

-b file     文件为块特殊文件为真

-s file     文件大小非0时为真

-t file     当文件描述符(默认为1)指定的设备为终端时为真

20.2.4 复杂与逻辑判断

-a  与

-o

!        非

20.3 IF判断符

20.3.1 两个整数数值判断

20.3.1.1 判断两个数值想等

# vi   ifTest.sh

#bin/sh

a=10

b=10

if [ $a = $b ];then

  echo "a = b"

else

  echo "a != b"

 fi

 

 

# sh ifTest.sh

a = b

20.3.1.2 判断两个数值不相等

# vi   ifTest.sh

#bin/sh

a=10

b=9

 

if [ $a != $b ];then

echo "a != b"

else

  echo "a = b"

 fi

 

$ sh ifTest.sh

a != b

20.3.1.3 判断两值的大小

# vi   ifTest.sh

 

#bin/sh

a=10

b=9

 

if [ $a -gt $b ];then

echo " a > b"

else

  echo "a < b"

 fi

 

 

$ sh ifTest.sh

 a > b

20.3.1.4 多层判断

$ vi ifTest.sh

 

#bin/sh

a=8

b=9

c=7

 

if [ $a  -gt  $b ];then

echo " a > b"

elif [ $a -gt $c ];then

  echo "a > c"

else

  echo " a !> b and a !> c"

 fi

 

 

$ sh ifTest.sh

a > c

 

20.3.1.5 判断是否为空

实例一

# vi  ifz.sh

#bin/sh

a=

 

if [ -z $a ];then

    echo "a is null"

fi

 

# sh ifz.sh

a is null

 

 

实例二

 

# vi  ifn.sh

#bin/sh

a=a

 

if [ -n $a ];then

    echo "a is not null"

fi

 

 

$ sh ifTest.sh

d is not null

20.3.2 内循环的IF

$  sh insideSh.sh

 

#!/bin/bash

a=100

if [ $a -ge 60 ];then

if [ $a -ge 80 ];then

if [ $a -gt 90 ];then

echo " a > 90 "

else

echo "a > 80"

fi

else

echo "a > 60"

fi

else

echo " a < 60"

fi

 

 

$ sh insideSh.sh

 a > 90

 

20.4 FOR循环符

20.4.1 FOR循环使用

20.4.1.1 随机生成数

$ sh forNumber.sh

 

#!bin/sh

for i in {1..100};do

echo $i

done

 

 

$ sh forNumber.sh

1

2

3

4

5

*************

 

或者写成以下的格式

#!bin/sh

for i in $(seq 1 10);do

echo $i

done

 

$ sh forNumber.sh

1

2

3

4

5

*****

20.4.1.2 对一个数进行求和

$ vi forsum.sh

 

#!bin/base

for((i=1;i<=100;i++));do

sum=$(($sum+$i));

done

 

echo " 1 .. 100 sum is:"$sum

 

 

$ sh forsum.sh

 1 .. 100 sum is:5050

20.4.1.3 九九乘法表

$ vi fornine.sh

 

#!/bin/bash

for((i=1;i<=9;++i))

do

  for((j=1;j<=i;j++))

    do

      echo -ne "$i*$j=$((i*j))\t"

  done

 echo

done

 

 

$ sh  fornine.sh

1*1=1

2*1=2   2*2=4

3*1=3   3*2=6   3*3=9

4*1=4   4*2=8   4*3=12  4*4=16

5*1=5   5*2=10  5*3=15  5*4=20  5*5=25

6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36

7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49

8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64

9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81

20.4.1.4 求100以内的素数

$ vi forprime.sh

 

for ((i=2;i<=100;i++));do

   for ((x=2;x<=i;x++));do

      if [ $[$i%$x] -eq 0 ];then

        break;

      fi

    done

    if [ $i -eq $x ];then

      echo "$i is 质数"

     fi

done

 

$ sh forprime.sh

2 is 质数

3 is 质数

5 is 质数

7 is 质数

11 is 质数

13 is 质数

*******

20.4.1.5 遍历文件的内容

$ vi forTest.sh

 

#!bin/base

hosts=`cat /etc/hosts`

for i in $hosts

do

  echo $i

done

 

或写成

 

for readFile in `cat $1`;

do

echo $readFile

done

20.4.2 批量替换文件的后缀

20.4.2.1 脚本实例

# touch 123.jpg  1234.jpg

 

# vim  replaceSuffix.sh

 

#!bin/bash

for obj in $(ls *.jpg)

do

    mv ${obj} $(echo ${obj/%jpg/JPG})

done

20.4.2.2 脚本运行

# ls

  1. JPG  123.JPG  replaceSuffix.sh

 

20.4.3 列出文件夹下的所有文件

实现脚本

# cat ll-file.sh

#!bin/bash

for file in `ls`

do

 echo $file

done

 

运营效果

# sh ll-file.sh

1.txt

get-dir.sh

ll-file.sh

xiaoxu.sh

 

20.5 WHILE 循环符

20.5.1 while 循环符的使用

20.5.1.1 依次循环查找出最大的数

$ vi whiletest.sh

 

#!bin/base

min=1

max=5

while [ $min -le $max ]

do

 echo $min

 min=`expr  $min + 1`

done

 

 

$ sh whiletest.sh

1

2

3

4

5

20.5.1.2 求能4整除的数

$ vi whileEven.sh

 

#!bin/sh

i=1

while(($i<100))

do

 if(($i%4==0))

  then echo $i

  fi

  i=$(($i+1))

done

 

 

$ sh whileEven.sh

4

8

12

16

20

24

 

20.5.2 WHILE快速循环

# while true; do ll -h; sleep 4s; done;

 

$ while true;

> do

> ll -h

> sleep 2s

> done;

20.6 CASE 多重分支

20.6.1 执行多个命令

20.6.1.1 按照条件执行命令

$ sh casetest.sh

 

#!/bin/bash

echo

echo  "Command action"

        echo -e "\th\t显示命令帮助"

        echo -e "\tf\t显示磁盘分区"

        echo -e "\td\t显示磁盘挂载"

        echo -e "\tm\t查看内存使用"

        echo -e "\tu\t查看系统负载"

        echo -e "\tq\t退出程序"

echo

 

#echo -ne "Command (h for help): "

#read command

 

read -p "Command (h for help): " command

case "$command" in

h)

echo "Command action"

echo -e "\th\t显示命令帮助"

echo -e "\tf\t显示磁盘分区"

echo -e "\td\t显示磁盘挂载"

echo -e "\tm\t查看内存使用"

echo -e "\tu\t查看系统负载"

echo -e "\tq\t退出程序"

echo

        ;;

f)

        fdisk -ul

        ;;

d)

        df -Th

        ;;

m)

        free -m

        ;;

u)

        uptime

        ;;

q)

        exit

        ;;

'')

        echo "Command (h for help): "

        ;;

*)

        echo "$command: unknown command"

Esac

 

 

 

$ sh casetest.sh

Command action

        h       显示命令帮助

        f       显示磁盘分区

        d       显示磁盘挂载

        m       查看内存使用

        u       查看系统负载

        q       退出程序

 

Command (h for help):  

20.6.1.2 实现正则匹配CASE

$ sh whilecase.sh

 

#!/bin/bash

#实现输入成绩等级判断

while :

do

read -p "请输入一个成绩[0-100],按"q"退出: " grade

case "$grade" in

 [1-5][0-9])

echo "差"

;;

[6-7][0-9])

echo "良"

;;

[8-9][0-9]|100)

echo "优"

;;

q)

exit

;;

*)

echo "你输入的不正确,请重新输入"

esac

done

 

| 是或的意思

 

$ sh whilecase.sh

请输入一个成绩[0-100],按q退出: 40

请输入一个成绩[0-100],按q退出: 90

请输入一个成绩[0-100],按q退出: 129

你输入的不正确,请重新输入

请输入一个成绩[0-100],按q退出: 32

请输入一个成绩[0-100],按q退出:

 

20.7 函数编程

20.7.1 参数函数

# vi function.sh

 

#!/bin/bash

 

function hello_world(){

  echo "function test"

  echo $1 $2

  return 1

}

 

hello(){

echo "helloword"

}

 

#  在此处调用

hello_world ede ssd

hello

 

 

 

# 在此处进行测试

# sh  function.sh

function test

ede ssd

helloword

20.8 常见文件编程

20.1 获取文件命与后缀

20.1.1 脚本实例

# cat   xiaoxu.test

 

#!bin/bash

 

fileName='1234.txt'

 

# 获取文件的名字

echo ${fileName%.*}

 

#获取文件的后缀

echo ${fileName##*.}

20.1.2 脚本效果

# sh  xiaoxu.sh

1234

txt

20.2 字符串替换

20.2.1 脚本实例

# vim replaceShell.sh

 

#!bin/base

str='Hello World'

# 替换开头。如果STR以OLD串开头,则替换

# ${STR/#$OLD/$NEW}

# 替换结尾。如果STR以OLD串结尾,则替换。

# ${STR/%$OLD/$NEW}

 

# 替换第一个匹配的字母

echo ${str/o/O}

# 全部匹配替换

echo ${str//o/O}

 

# 开始从后面开始匹配

echo ${str/%ld/ID}

20.2.2 运行效果

# sh  replaceShell.sh

HellO World

HellO WOrld

Hello WorID

20.3 字符串删除

20.3.1 脚本实例

# vim deleteShell.sh

 

#!bin/base

 

str='Hello World'

 

# 删除第一个匹配的单词

echo ${str#He}

 

# 正则删除单词

echo ${str#He*o}

 

# 正则匹配多个值

echo ${str##He*o}

20.3.2 运行效果

# sh  deleteShell.sh

llo World

World

Rld

20.4 字符串操作

20.4.1 脚本实例

# vim replaceSuffix.sh

#!bin/bash

 

str='123456789abcdEFGH'

 

# 获取字符串的长度

echo ${#str}

 

# 截取字符串

echo ${str:1:3}

 

# 把小写字母转大写

echo $str|sed 's/.*/\U&/'

 

# 把大写字母转小写

echo $str|sed 's/.*/\L&/'

 

#获取制定分隔符的位置

echo ${str##*:}

 

# 获取第一个分割的位置

echo ${str%%:*}

 

# 打印最后5个字符

echo ${str: -4}

 

# 输出该变量的值

echo ${str:-5}

 

 

说明: \U 是转换为大写,\L 是转换为小写

20.4.2 运行效果

# sh replaceSuffix.sh

17

234

123456789ABCDEFGH

123456789abcdefgh

20.5 字符串的空格替换

20.5.1 脚本实例

# cat 123.txt

1233 342 242 2323231

131313 2331

20.5.2 运行效果

# sed 's/[[:space:]]//g' 123.txt

12333422422323231

1313132331

20.5.3 替换成一行

# sed 's/[[:space:]]//g' 123.txt |sed ":a;N;s/\n//g;ta"

123334224223232311313132331

 

参考资料:

http://kodango.com/sed-and-awk-notes-part-4

http://kodango.com/sed-and-awk-notes-part-5

 

20.9 脚本调试

sh 调试

# sh -x xiaoxu.sh

+ str='ssss

csdd

scscee

def'

+ echo ssss csdd scscee def

+ awk '{if ($1 == "ssss"){print $2 $3}}'

Csddscscee

 

带+ 号的是脚本中的执行过程

21 工作中常用知识汇总

21.1 替换文件中的隐藏字符

# cat asciiReplaceScript.sh

 

#!bin/sh

 

# 特殊字符查看表

# https://blog.csdn.net/xfg0218/article/details/80901752

 

echo  "参数说明"

        echo -e "\t 把此脚本复制到带有特殊字符的文件夹下运行此脚本即可把全部文件进行替换,例如:sh asciiReplaceScript.sh"

echo

 

echo -e "\t 转换开始...... \n "

 

# 设置脚本开始时间

starttime=`date +'%Y-%m-%d %H:%M:%S'`

 

# 特殊字符的集合,28是特殊字符的10进制代码

soh=`echo 1 | awk '{printf("%c", $1)}'`

stx=`echo 2 | awk '{printf("%c", $1)}'`

etx=`echo 3 | awk '{printf("%c", $1)}'`

eot=`echo 4 | awk '{printf("%c", $1)}'`

enq=`echo 5 | awk '{printf("%c", $1)}'`

ack=`echo 6 | awk '{printf("%c", $1)}'`

bel=`echo 7 | awk '{printf("%c", $1)}'`

bs=`echo 8 | awk '{printf("%c", $1)}'`

ht=`echo 9 | awk '{printf("%c", $1)}'`

lf=`echo 10 | awk '{printf("%c", $1)}'`

vt=`echo 11 | awk '{printf("%c", $1)}'`

ff=`echo 12 | awk '{printf("%c", $1)}'`

cr=`echo 13 | awk '{printf("%c", $1)}'`

so=`echo 14 | awk '{printf("%c", $1)}'`

si=`echo 15 | awk '{printf("%c", $1)}'`

dle=`echo 16 | awk '{printf("%c", $1)}'`

dc1=`echo 17 | awk '{printf("%c", $1)}'`

dc2=`echo 18 | awk '{printf("%c", $1)}'`

dc3=`echo 19 | awk '{printf("%c", $1)}'`

dc4=`echo 20 | awk '{printf("%c", $1)}'`

nak=`echo 21 | awk '{printf("%c", $1)}'`

syn=`echo 22 | awk '{printf("%c", $1)}'`

etb=`echo 23 | awk '{printf("%c", $1)}'`

can=`echo 24 | awk '{printf("%c", $1)}'`

em=`echo 25 | awk '{printf("%c", $1)}'`

sub=`echo 26 | awk '{printf("%c", $1)}'`

esc=`echo 27 | awk '{printf("%c", $1)}'`

fs=`echo 28 | awk '{printf("%c", $1)}'`

gs=`echo 29 | awk '{printf("%c", $1)}'`

rs=`echo 30 | awk '{printf("%c", $1)}'`

us=`echo 31 | awk '{printf("%c", $1)}'`

del=`echo 127 | awk '{printf("%c", $1)}'`

 

 

# 循环把文件下的所有文件取出来

for replaceFile in  `ls *`

do

 

# 去除此脚本文件

if [ $replaceFile = $0  ];then

continue;

fi

 

echo -e "\t 文件" $replaceFile "替换开始...."

 

# 单个文件处理的额开始时间

single_time=`date +'%Y-%m-%d %H:%M:%S'`

 

# 单个文件替换开始

sed -i  -e 's/[\x0]//g' -e 's/'$soh'//g' -e 's/'$stx'//g' -e 's/'$etx'//g' -e 's/'$eot'//g' -e 's/'$enq'//g' -e 's/'$ack'//g' -e 's/'$bel'//g' -e 's/'$bs'//g' -e 's/'$lf'//g' -e 's/'$vt'//g' -e 's/'$ff'//g' -e 's/'$cr'//g' -e 's/'$so'//g' -e 's/'$si'//g' -e 's/'$dle'//g' -e 's/'$dc1'//g' -e 's/'$dc2'//g' -e 's/'$dc3'//g' -e 's/'$dc4'//g' -e 's/'$nak'//g' -e 's/'$syn'//g' -e 's/'$etb'//g' -e 's/'$can'//g' -e 's/'$em'//g' -e 's/'$sub'//g' -e 's/'$esc'//g' -e 's/'$fs'//g' -e 's/'$gs'//g' -e 's/'$rs'//g' -e 's/'$us'//g' -e 's/'$del'//g' -e 's/'$'//g'  $replaceFile

 

# 就算单个文件耗时

single_endtime=`date +'%Y-%m-%d %H:%M:%S'`

single_start_seconds=$(date --date="$single_time" +%s);

single_end_seconds=$(date --date="$single_endtime" +%s);

 

echo -e "\t 文件" $replaceFile "替换结束,耗时:"$((single_end_seconds-single_start_seconds))"s"

echo -e "\n"

 

done

 

echo -e "\t 全部文件转换结束......"

 

# 全部文件替换的总耗时

endtime=`date +'%Y-%m-%d %H:%M:%S'`

start_seconds=$(date --date="$starttime" +%s);

end_seconds=$(date --date="$endtime" +%s);

 

echo -e "\t 脚本总耗时:"$((end_seconds-start_seconds))"s"

 

# 退出脚本

exit

 

21.2 获取本脚本所在的路径

21.2.1 执行的脚本

# cat get-dir.sh

#!bin/bash

bashPath=$(cd `dirname $0`;pwd)

echo $bashPath

 

# cat get-dir.sh

#!bin/bash

 

dirbash=$(eval pwd)

echo $dirbash

 

# cat  get-dir.sh

#!bin/bash

bashpath=`pwd`

echo $bashpath

 

 

# sh  get-dir.sh

/home/xiaoxu/test

21.2.2 运行效果

# sh baseShellPath.sh

/home/xiaoxu/test

 

21.3 批量改变文件的后缀

# cat  batch-change-suffix.sh

 

#!bin/bash

oldsuffix="jpeg"

newsuffix="jpg"

dir=$(eval pwd)

for file in $(ls $dir | grep .${oldsuffix})

    do

        name=$(ls ${file} | cut -d. -f1)

        mv $file ${name}.${newsuffix}

    done

echo "change $oldsuffix to $newsuffix  successd!"

 

或使用以下方法

for i in `ls *.txt`; do sed 's/|$//' $i > ${i/csv/txt} ;done

 

21.4 批量替换文本中的字符

# cat replace-middle-char.sh

#!bin/bash

 

for file in `ls | grep .jpg`

do

 newfile=`echo $file | sed 's/-//g'`

 mv $file $newfile

done

21.5 Linux常见的特殊字符问题

21.5.1 \x01 字符

\x01\x015138223017959\x01G\x015419\x012006-06-14 00:00:00.0\x012999-12-31 00:00:00.0

说明:这是hive的默认分隔符,用脚本awk或python可以把分隔符设置为'\x01',在vim中可以使用sed -i -e 's/\\x01//g'  fileName 来替换掉

 

22 Linux 正则的使用

22.1 正则说明

22.1.1 Grep 常用正则使用

^ 行首

$ 行尾

. 除了换行符以外的任意单个字符

* 匹配零次多多次

.* 所有字符

| : 表示或的范围

+   一次或多次匹配

?   零次或者一次匹配

[] 字符组内的任一字符

[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)

^[^] 非字符组内的字符开头的行

[a-z] 小写字母

[A-Z] 大写字母

[a-Z] 小写和大写字母

[0-9]  : 匹配0-9数字的的范围的数据

[^0-9]  : 匹配不在0-9数字的的范围的数据

[a-zA-Z] : 匹配小写字母与大写字母

[0-9a-zA-Z] : 匹配数字与小写字母与大写字母的匹配

[a-z][A-Z]:匹配第一个字母是小写字母第二个字母是大写字母的数据

[0-9][0-9]:匹配第一个数字与第二个数字数据

\b[0-9][0-9]\b : 匹配有两位数字的数据

x\{m,n\} :重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。

m.*c : *表示匹配任何长度的字符串,例如:mnrnrvnfdc,mfrf3434c

m..c : 表示m与c之间只有两个字母相隔的匹配,例如:mdfc,m65c

 

[.:/] : 匹配数据中的.:/

^root : 首字母是root的匹配,注意与[^root]的区别

root$ : 尾字符是root的匹配

^$ : 表示当前的空行

\w : 与[a-zA-Z0-9]匹配相等,匹配任何字类字符

\W : 与[^a-zA-Z0-9]匹配相等,匹配任何非字类字符

\b : 代表单词的分割,例如:[\bx\b] 表示匹配***x***

 

[[:alnum:]] 相当于[a-zA-Z0-9]

[[:blank:]] 匹配范围为 空格和TAB键

22.1.2 Grep 常用实例

22.1.2.1 查看样例

# cat 1.txt

1212,1213,23

3d,sfsd

DDFEG:dfd:/24343

多的地方8089,9080

地方:2323:电放费

 

6565/212/867868

分 /想 晚上

哥/菲:问我

  1. 4566 990

22.1.2.2 匹配含有0-9的数据

# grep '[0-9]' 1.txt

1212,1213,23

3d,sfsd

DDFEG:dfd:/24343

多的地方8089,9080

地方:2323:电放费

6565/212/867868

  1. 4566 990

22.1.2.3 匹配含有a-z到A-Z的数据

# grep '[a-zA-Z]' 1.txt

3d,sfsd

DDFEG:dfd:/24343

22.1.2.4 不匹配含有a-zA-Z的数据

# grep '[^a-zA-Z]' 1.txt

1212,1213,23

3d,sfsd

DDFEG:dfd:/24343

多的地方8089,9080

地方:2323:电放费

6565/212/867868

分 /想 晚上

哥/菲:问我

  1. 4566 990

22.1.2.5  匹配数据中的空行

# grep -n '^$' 1.txt

6:

22.1.2.6 匹配TAB行

# grep -n '[[:blank:]]' 1.txt

8: 分 /想 晚上

10:123 4566 990

22.1.2.7 表示或的匹配

# grep -n 'sbin/\(bash\|nologin\)'  passwd

2:bin:x:1:1:bin:/bin:/sbin/nologin

3:daemon:x:2:2:daemon:/sbin:/sbin/nologin

4:daemon:x:2:2:daemon:/sbin:/sbin/bash

**********

22.1.2.8 匹配制定范围的数字

# grep '^[0-9]\{4,10\}$' 1.txt

2323234

4565754323

45434

22.1.2.9 匹配15到18位的身份证号(尾号有X)

# grep '^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' 1.txt

576786543232435456

45474634534257465X

你可能感兴趣的:(liunx)