linux系统管理—第五章Linux-bashshell

linux系统管理—第五章Linux-bashshell

概述

 

什么是shell

Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

 

Linux中的shell有多种类型,其中最常用的几种是Bourne shellsh)、C shellcsh)和Korn shellksh)。

三种shell各有优缺点。Bourne shellUN最初使用的shell,并且在每种UN上都可以使用。Bourne shellshell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell

Linux操作系统缺省的shellBourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shellKorn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面

bash shell 是 Linux 的默认 shell

5.1 bash shell基础教程

5.1.1 SHEEL语法

Bash sheel 执行命令

命令 选项 参数 shell每个基本的构成元素之间都相隔一个空格。

[root@Redhat7 ~]# ls -a /tmp/ 多个参数可以写在一起

 

5.1.2 查看当前使用的shell

[root@Redhat7 ~]# echo $SHELL

/bin/bash

5.1.3 查看系统可用的SHELL

[root@Redhat7 ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

/bin/tcsh

/bin/csh

5.1.4 bash 功能呢

1 历史命令查找history

查询所执行的命令

History 当然上下键也可以

~/.bash_ history

在家目录下记载

 

2 命令补全tab

Bash sheel 输入命令或者参数的前几个,按tab就可以补全。

3 命令别名设置

[root@pg11m ~]# alias

alias cp='cp -i'

alias egrep='egrep --color=auto'

alias fgrep='fgrep --color=auto'

alias grep='grep --color=auto'

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

 

alias la=’ls –al’

4 查询命令是否为内置命令Type

[root@pg11m ~]# type ls

ls 是 `ls --color=auto' 的别名

5.1.5 Bash特性:命令快捷键

使用最多的就是

Ctrl+c 终止前台任务

Ctrl+l 清屏 和clear等效

Ctrl+a 光标跳转到首行

Ctrl+e 光标跳转到末尾

History 查看系统命令历史

-w 保存命令历史到历史文件

-c 清空命令历史

-d 删除命令历史的第N行

[root@Redhat7 ~]# history

  342  ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

  343  cat /etc/sysconfig/network-scripts/ifcfg-eno16777736

  344  ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

!行号,执行固定行的命令

[root@Redhat7 ~]# !344

ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

/etc/sysconfig/network-scripts/ifcfg-eno16777736

!命令,执行最近命令

[root@Redhat7 ~]# !ls

ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

/etc/sysconfig/network-scripts/ifcfg-eno16777736

5.1.6 bash特性-别名

命令别名将⽤户经常使⽤的复杂命令简单化, 可以⽤ "alias 别名名称=命令" 命令创建属于⾃⼰的
命令别名, 若要取消⼀个命令别名,则是⽤ unalias 别名名称 命令。

 

//1.定义临时别名, if1为查看eth0⽹卡别名
[root@xuliangwei ~]# alias if0='ifconfig eth0'
[root@xuliangwei ~]# if0

 

//2.定义系统永久⽣效别名, 将命令别名添加⾄当前⽤户环境配置⽂件
[root@xuliangwei ~]# echo "alias ifconfig='ifconfig eth0'" >> ~/.bashrc
//如将别名命令添加⾄/etc/bashrc , 对所有⽤户⽣效
//3.取消临时别名
[root@xuliangwei ~]# unalias ifconfig

 

/etc/bashrc 全局环境变量

家目录 .bashrc个人用户环境变量

全局环境变量和个人用户环境变量=全局等于妈妈让你去相亲,个人最后做决定的还是你。

5.1.7 Bash:命令的操作环境

内部命令:shell程序自带的命令。

外部命令:在系统PATH变量的某个路径下的可执行程序。

当我们执⾏⼀个命令, 整个命令执⾏流程如下:

1.判断命令是否通过绝对路径执⾏

2.判断命令是否存在别名

3.判断⽤户输⼊的是内部命令还是外部命令

4.内部命令直接执⾏, 外部命令检测是否存在缓存

5.检测 PATH 路径, 有执⾏, ⽆报错

Type 检测命令类型

[root@Redhat7 ~]# type -a cd

cd 是 shell 内嵌

cd 是 /usr/bin/cd

 

[root@jsmongodb ~]# type -a mongod

mongod 是 /app/mongodb3.0/bin/mongod

PATH 变量定义的路径, 作⽤是告诉 Bash 执⾏的外部命令存放的位置, Bash 会在这些路径中进⾏逐个扫描。

1. /etc/profile: 这是系统整体的设置,你最好不要修改这个文件;

2. ~/.bash_ profile 或~/.bash. _login 或-/.profile:属于用户个人设置,你要添加自己的数据,就写入这里;

1 修改命令个人环境变量

bash在读完了整体环境设置的/etc/profile并借此调用其他配置文件后,接下来则是会读取用户的

个人配置文件。在login shell 的bash环境中,所读取的个人偏好配置文件其实主要有三个,依序分

别是:

~/.bash_ _profile

 ~/.bash_ login

~/.profile

其实bash的login shell 设置只会读取.上面三个文件的其中-个,而读取的顺序则是依照上面的

顺序。也就是说,如果~/.bash_ _profile 存在,那么其他两个文件不论有无存在,都不会被读取。如果

~/.bash_ _profile 不存在才会去读取~/.bash login, 而前两者都不存在才会读取~/.profile的意思。会有

个人环境变量修改

[root@jsmongodb ~]# cat .bash_profile

# .bash_profile

 

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi

 

# User specific environment and startup programs

 

PATH=$PATH:$HOME/bin

 

export PATH

MONGODB_HOME=/app/mongodb3.0

export MONGODB_HOME

 

PATH=$MONGODB_HOME/bin:$PATH

export PATH

 

 

[root@jsmongodb ~]# echo $PATH

/app/mongodb3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2 修改全局命令环境变量

//PATH由多个路径组成,每个路径值之间⽤冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找。
全局环境变量修改

//修改PATH变量
[root@xuliangwei ~]# PATH=/soft/bin:$PATH
//写⼊/etc/profile配置⽂件永久⽣效
echo 'export PATH=/soft/bin:$PATH' >> /etc/profile

5.1.8 Bash 特性 路径展开

 

Linux Shell 下路径展开⽤花括号包括, 逗号分隔, 这样花括号⾥的内容会被展开形成列表。

 

[root@Redhat7 ~]# rm -rf /tmp/{zz,yy}

 

[root@Redhat7 ~]# mkdir /tmp/zz/a/b /tmp/yy/a/b -pv

mkdir: 已创建目录 "/tmp/zz"

mkdir: 已创建目录 "/tmp/zz/a"

mkdir: 已创建目录 "/tmp/zz/a/b"

mkdir: 已创建目录 "/tmp/yy"

mkdir: 已创建目录 "/tmp/yy/a"

mkdir: 已创建目录 "/tmp/yy/a/b"

 

 

[root@Redhat7 ~]# mkdir /tmp/{zz,yy}/a/b –pv

1 . .特性

[root@Redhat7 ~]# echo {1.55}

{1.55}

[root@Redhat7 ~]# echo {1..55}

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

 . .后续是至的意思。

[root@Redhat7 ~]# mkdir -pv /iso7.2/syjhct/iso2019{1..12}

mkdir: 已创建目录 "/iso7.2/syjhct"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20191"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20192"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20193"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20194"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20195"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20196"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20197"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20198"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20199"

mkdir: 已创建目录 "/iso7.2/syjhct/iso201910"

mkdir: 已创建目录 "/iso7.2/syjhct/iso201911"

mkdir: 已创建目录 "/iso7.2/syjhct/iso201912"

 

5.1.9 shell元字符

 

 

shell 除了有通配符之外,由shell 负责预先先解析后,将处理结果传给命令行之外,shell还有一系列自己的其他特殊字符。

shell元字符

字符

说明

 =

 变量名=值,为变量赋值。注意=左右紧跟变量名和值,中间不要有空格

 $

 变量值替换,$变量名替换为shell变量的值;

 >

 prog > file 将标准输出重定向到文件。

 >>

 prog >> file 将标准输出追加到文件。

 <

 prog < file 从文件file中获取标准输入

 |

 管道命令,例:p1 | p2 将p1的标准输出作为p2的标准输入

 &

 后台运行命令,最大好处是无需等待命令执行结束,就可以在同一命令行下继续输入命令

 ()

 在子shell中执行命令

 {}

 在当前shell中执行命令,或用在变量替换的界定范围(例如上面的${变量名}用法)。

 ;

 命令结束符。例如p1;p2表示先执行p1,再执行p2

 && 等同 and

在前一个命令结束时,若返回值为 true,继续执行下一个命令。

 || 等同 or

在前一个命令结束时,若返回值为 false,继续执行下一个命令。

 !

 执行历史记录中的命令

 ~

 home目录

 

特殊符号(#)

注释符号(Hashmark[Comments])

1.在shell文件的行首,作为shebang标记,#!/bin/bash;

2. 其他地方作为注释使用,在一行中,#后面的内容并不会被执行,除非;

3. 但是用单/双引号包围时,#作为#号字符本身,不具有注释作用。

特殊符号(.)

点号(dot command [period])。

1. 相当于bash内建命令source,如:

#!/bin/bash

./mongod

 

5.1.10 shell 通配符与特殊符号

1 通配符

* 代表匹配任意长度的字符

? 代表匹配任意单个字符

[ ]  代表指定范围的单子字符

;; 前面命令是否执行完成都会执行后面命令

&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令。 *

||    在前一个命令结束时,若返回值为 false,继续执行下一个命令。 *

 

[list]      匹配list中的任意单一字符  a[xyz]b  a与b之间有且只有一个字符, 且只能是x或y或z, 如: axb, ayb, azb。

 [!list]    匹配除list中的任意单一字符     a[!0-9]b  a与b之间有且只有一个字符, 但不能是数字, 如axb, aab, a-b等

 [c1-c2]  匹配c1-c2中的任意单一字符     a[0-9]b  a与b之间有且只有一个字符,该字符是0-9之间的数字,如a0b, a1b,... ,a9b。

[root@Redhat7 ~]# touch /syjjjj/{xz,xy,yz}

[root@Redhat7 ~]# ls /syjjjj/            

x  xy  xyz  xz  y  yz  z

[root@Redhat7 ~]# ls /syjjjj/[xyz]

/syjjjj/x  /syjjjj/y  /syjjjj/z

[root@Redhat7 ~]# ls /syjjjj/[x,z]

/syjjjj/x  /syjjjj/z

[root@Redhat7 ~]# ls /syjjjj/[x-z]

/syjjjj/x  /syjjjj/y  /syjjjj/z

 

 

[root@Redhat7 ~]# ls /iso7.2/Packages/*DB*

/iso7.2/Packages/perl-DBD-MySQL-4.023-5.el7.x86_64.rpm

/iso7.2/Packages/perl-DBD-Pg-2.19.3-4.el7.x86_64.rpm

/iso7.2/Packages/perl-DBD-SQLite-1.39-3.el7.x86_64.rpm

2 特殊符号

5.1.11 Bash特性:转义字符

Shell解释器提供了⾮常丰富的转义字符, 来实现字符处理以及命令替换。

4类常⽤转义字符

反斜杠(\):使反斜杠后⾯的⼀个变量变为字符串。

单引号(''):转义其中所有的变量为单纯的字符串。

双引号(""):保留其中的变量属性,不进⾏转义处理。

反引号(``):基本不用,把其中的命令执⾏后返回结果。不好用,一般使用$(命令)

[root@Redhat7 ~]# echo the directory is $PWD

the directory is /root

反斜杠(\):使反斜杠后⾯的⼀个变量变为字符串。

 

[root@Redhat7 ~]# echo the directory is \$PWD

the directory is $PWD

 

 

[root@Redhat7 ~]# syj=hct

[root@Redhat7 ~]# echo $syj

hct

[root@Redhat7 ~]# echo \$syj

$syj

[root@Redhat7 ~]# echo $syj+$syj

hct+hct

[root@Redhat7 ~]# echo '$syj+$syj'

$syj+$syj

 

 

5.2 BASH SHELL变量

存在于内存空间中的,一组文字或符号组成,用于替代一些设置或数据,特别是复杂或变动的数据-变量最大的好处就是方便。

用户自定义变量、环境变量、位置变量、特殊变量。

5.2.1 变量的分类

1用户自定义变量

只能作用于当前Shell,变量取值都是一个字符串

DAY=date “=”左右两边不能有空格

DAY=“today is date” 若含有空格,则需要加双引号

echo $DAY $调用变量,echo打印输出

unset DAY 删除变量

set 该命令查看系统所有变量

2环境变量

全局的,所有Shell都可以调用的变量

export DAY=date export命令就是将变量导出为环境变量

env env命令是查看系统所有的环境变量

环境变量PATH:为系统命令搜索的路径。

PATH="$PATH":/usr/sbin 即添加/usr/sbin目录也为PATH变量,若想要永久更改环境

变量,需要修改环境变量配置文件。

3位置参数

$n n为数字,$0代表命令本身,$1-$9代表第1-9个参数,10以上的需要用大括号${10},不能直接写$10

$* 代表命令行中所有参数,$*把所有参数当做一个整体

$@ 代表命令行所有参数,$@把每个参数区分对待

$# 代表命令行中参数的个数

 

 

4特殊变量

$? 最后一次执行的命令的返回状态。若为0,则表示命令执行正确;若为非0,代表上一条指令执行错误。

$$ 当前进程的进程ID号

$! 后台运行的最后一个进程的进程号

 

 

 

5.2.3 变量的设置-使用echo规则-unset

1 变量的设置

变量的设置规则

A 变量与变量内容以一个等号[= ]来连接,如下所示:

myname=syjjj

B 等号两边不能直接接空格,如下所示为错误:

myname = VBird或myname=VBird Tsai

C 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:

2myname=Vbird

 

D变量内容若有空格可使用双引号["]或单引号[']将变量内容结合起来,但:

 

E双引号内的特殊字符如$等,可以保有原本的特性,如下所示:

var="lang is $LANG"则echo $var可得lang is zh__CN.UTF-8

F 单引号内的特殊字符则仅为一般字符(纯文本),如下所示:

var='lang is $LANG'则echo $var可得lang is $LANG

G可用转义符[\]将特殊符号(如[Enter]、 $、\、空格、'等)变成一般字符,如:

mvname=VBird\ Tsai

2 数组变量

var[index]=content

 

[postgres@pg11m ~]$ var[1]="sss wewe"

[postgres@pg11m ~]$ echo $var[1]

lane is zh_CN.UTF-8[1]

[postgres@pg11m ~]$ echo ${var[1]}

sss wewe

 

 

3 取消变量unset

[root@pg11m ~]# var="lane is $LANG"

[root@pg11m ~]# echo $var

lane is zh_CN.UTF-8

[root@pg11m ~]# echo $var

lane is zh_CN.UTF-8

[root@pg11m ~]# unset var

[root@pg11m ~]# echo $var

4使用变量 echo 建议使用的时候加{}

[root@pg11m ~]# var="lane is $LANG"

[root@pg11m ~]# echo $var

目前建议使用的时候加{}

[postgres@pg11m ~]$ echo ${var}

lane is zh_CN.UTF-8

lane is zh_CN.UTF-8

 

 

这就是未什么建议使用{}的原因

[postgres@pg11m ~]$ var[1]="sss wewe"

[postgres@pg11m ~]$ echo $var[1]

lane is zh_CN.UTF-8[1]

[postgres@pg11m ~]$ echo ${var[1]}

sss wewe

5 特殊说明-单双引号-双引号-$()

单双引号

     [root@boxin ~]# lang="lang is $LANG"   //双引号,保持特性
     [root@boxin ~]# echo $lang
     lang is en_US.UTF-8
     [root@boxin ~]# lang=‘lang is $LANG‘    //单引号,纯文本
     [root@boxin ~]# echo $lang
     lang is $LANG

$()

     [root@boxin ~]# version=$(uname -r)    //命令执行结果作为变量作为外部输入信息
 

 

 

5.2.4 读取键盘变量read

read

要读取来自键盘输入的变量,就是用read这个命令。

 

[dmtsai@study ~]$ read [-pt] variable

选项与参数:

-p:后面可以接提示字符。

-t:后面可以接等待的[秒数],这个比较有趣,不会一直等待使用者。

 

[postgres@pg11m ~]$ read -p "please keyin your name:" -t 30 vname

please keyin your name:syjhct

[postgres@pg11m ~]$ echo $vname

syjhct

 

5.2.5 变量的有效范围与配置文件

 

1环境变量配置文件

A souce命令 修改配置文件后使之生效

souce 配置文件

或者 .配置文件

如:souce /etc/profile ; ./.bash_profile

 

B常用环境变量配置文件:

/etc/profile

/etc/profile.d/*.sh

~/.bash_profile

~/.bashrc

/etc/bashrc

 

C 其他环境变量配置文件

01.注销时生效的文件:~/.bash_logout 如可以在每次注销时清空历史命令,将history

-c写入该文件(但一般不建议)

02.历史命令保存文件:~/.bash_history

03.本地Shell登录欢迎信息:/etc/issue

该文件中用到的转义符,/d显示当前系统日期,/s操作系统名称,/m硬件体系结构,/r内

核版本,/t系统时间,/l登录的终端

号,/o域名,/n主机名

04.远程登录欢迎信息:/etc/issue.NET

要显示此信息,需要SSH配置文件/etc/ssh/sshd_config中要加入“Banner /etc/issue.Net”

05.登录欢迎信息:etc/motd

不管是本地还是远程登录都能显示此信息。

2 export

可以使用export把自定义变量做出环境变量。

全局变量 global variable

局部变量 local variable

环境变量=全局变量

自定义变量=局部变量

export PATH=$PATH:$HOME/bin:$PGHOME/bin

5.3 bash shell 数据流向

5.3.1 命令执行顺序; && ||

1 ;连续执行

不考虑相关性,连续执行。

Cmd;cmd

执行三遍sync同步磁盘,以后重启电脑

sync;sync;sync;reboot

2 &&与

命令1执行成功以后,命令2执行

[root@pg11m ~]# mkdir /tmp/abc

[root@pg11m ~]# ls /tmp/abc && touch /tmp/abc/syj

[root@pg11m ~]# ls /tmp/abc/

syj

3||或

命令1执行不成功以后,命令2执行

[root@pg11m ~]# rm -rf /tmp/abc/

[root@pg11m ~]# ls /tmp/abc || mkdir /tmp/abc

ls: 无法访问/tmp/abc: 没有那个文件或目录

 [root@pg11m ~]# ll /tmp/abc

总用量 0

5.3.2 重定向

在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:

0 是一个文件描述符,表示标准输入(stdin)

1 是一个文件描述符,表示标准输出(stdout)

2 是一个文件描述符,表示标准错误(stderr)

在日常工作中是把多个 Linux 命令适当地组合到一起,使其协同工作,以便我们更加高效地处理数据。要做到这一点,就必须搞明白命令的输入重定向和输出重定向的原理。

简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式。

何时使用重定向

1.当屏幕输出的信息很重要,⽽且我们需要将他存下来的时候

2.后台执⾏中的程序,不希望他⼲扰屏幕正常的输出结果时;

3.系统的例⾏命令, 例如定时任务的执⾏结果,希望他可以存下来时;

4.⼀些执⾏命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;

5.错误信息与正确信息需要分别输出时;

[root@RHCE7 ~]# find >/root/syj.txt 2>/root/syjerror.txt

 

 

 

 

 

1 标准输出重定向

[root@Redhat7 ~]# ifconfig >/root/syjjjj.txt 

清空原有文件

2标准输出重定向(追加)

[root@Redhat7 ~]# ifconfig >>/root/syjjjj.txt 

在原有文件追加

3错误和正确输出重定向分别写到不同文件

[root@Redhat7 etc]# find /etc 1>/root/syj.txt 2>/root/jjj.txt

4重定向到空设备

[root@Redhat7 etc]# ls  /root  >ab  2>/dev/null

 

5输入重定向

重定向的输入是<.

 

[root@Redhat7 ~]# grep root </etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

MySQL 表结构输入

[root@Redhat7 ~]# mysql -uroot -p123 <bbs.sql

 

 

6 脚本中使用重定向

[root@Redhat7 ~]# cat ping.sh

ping -c1 192.168.27.140 &>/dev/null

if [ $? -eq 0 ]; then

echo "192.168.27.140 is up"

else

echo "192.168.69.113 is down"

fi

[root@Redhat7 ~]# sh ping.sh

192.168.27.140 is up

7重定向总结

 

5.4 BASH管道

管道操作符号 "|" 连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输⼊。

 

 

5.4.1 管道技术实例-排序

[root@Redhat7 ~]# sort -t ":" -k3 -n /etc/passwd|head

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

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

5.4.2 管道技术实例-统计CPU前5

[root@Redhat7 ~]# ps aux --sort=-%cpu | head -6 

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

gdm        2443  0.3  4.1 1543032 77708 ?       Sl   21:45   0:02 gnome-shell --mode=gdm

root          1  0.1  0.2 123312  3880 ?        Ss   21:45   0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 21

root          4  0.1  0.0      0     0 ?        S    21:45   0:00 [kworker/0:0]

root        281  0.1  0.0      0     0 ?        S    21:45   0:01 [kworker/1:1]

root          2  0.0  0.0      0     0 ?        S    21:45   0:00 [kthreadd]

5.4.3 双向重定向tee

 

tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。

tee 命令的输出内容直接作为另一个命令的输入内容

 

 

 

[root@Redhat7 ~]# ls /iso7.2  | tee /output.txt | wc -l

15

[root@Redhat7 ~]# cat /output.txt                 

addons

EFI

EULA

GPL

images

isolinux

LiveOS

media.repo

Packages

release-notes

repodata

RPM-GPG-KEY-redhat-beta

RPM-GPG-KEY-redhat-release

syjhct

TRANS.TBL

 

Tee和> 效果一样,但是tee会 输出到屏幕

 

[root@Redhat7 ~]# date >syj.txt

[root@Redhat7 ~]# date | tee syj.txt

2019年 08月 20日 星期二 21:34:16 CST

5.4.4 选取命令:cut,grep

1 cut

cut 选项 字符串/文件

 

-d:指定字段的分隔符,默认的字段分隔符为“TAB”;

-f:显示指定字段的内容;

-b:仅显示行中指定字节范围的内容;

-c:仅显示行中指定字符范围的内容;

-n:与“-b”选项连用,不分割多字节字符;

2 cut实例

cat /etc/passwd | cut -b1-3 #取每行的第1-3字字节

cat /etc/passwd | cut -d : -f 3 #以:分割,取第三段

date |cut -b 1-10           #以:分割,取第三段

3 grep

根据专家指出Linux经常使用的命令只有两个。Ls和grep,这个命令是用来在文件中搜索满足特定要求的内容。Grep还有两个变种egrep 和fgrep 命令。在linux系统上使用频率比较高但也比较复杂的工具,它们是sed和awk命令,专家称这些工具(程序)为过滤器。

 

grep [选项]... PATTERN [FILE]...

 -E, --extended-regexp    使用扩展正则表达式 【不用使用 \ 了】,说白了,就是传递多个参数。使用|

grep -E 'pattern1|pattern2' filenam
    -c: 仅列出包含模式的行数。

-i: --ignore-case忽略模式中的字母大小写

 -l: 列出带有匹配行的文件名。.

 -n: 在每行的最前面列出行号。

 -v: 列出没有匹配模式的行。

 -w: --word-regexp  单词匹配把表达式作为一个完整的单字来搜寻,忽略那些部分匹配的行。

-v:显示不包含匹配文本的所有行

-R:递归查询子目录

4grep实例反向查找不包含#的配置

[root@pg11m ~]# grep -v '#' /usr/local/pgsql/data/postgresql.conf

log_directory = 'log'

log_filename = 'postgresql-%Y-%m-%d'

log_destination = 'csvlog'

logging_collector = on

log_truncate_on_rotation = on

log_rotation_size = 10MB

log_min_duration_statement = 1s

log_checkpoints = on

log_connections = on

log_disconnections = on

log_error_verbosity = verbose 

log_lock_waits = on

log_statement = 'ddl'

shared_preload_libraries = 'pg_cron,repmgr,pg_stat_statements'

5grep实例至显示几行

[root@pg11m ~]# grep -Ev '#|^$' -m 5 /usr/local/pgsql/data/postgresql.conf

max_wal_size = 1GB

min_wal_size = 80MB

log_timezone = 'PRC'

datestyle = 'iso, ymd'

timezone = 'PRC'

6 grep实例–E 扩展

[root@pg11m data]# grep -E 'MB|auto' postgresql.conf

说白了,就是传递多个参数。使用|

#log_rotation_size = 10MB          # Automatic rotation of logfiles will

#autovacuum = on                # Enable autovacuum subprocess?  'on'

#log_autovacuum_min_duration = -1       # -1 disables, 0 logs all actions and

7grep实例 匹配行首^,匹配行尾$

匹配行首包括#的字段

grep -n '^#' /usr/local/pgsql/data/postgresql.conf

[root@pg11m data]# grep -n '^#' /usr/local/pgsql/data/postgresql.conf

匹配行尾以B结束的字段

[root@pg11m data]# grep -n 'B$' /usr/local/pgsql/data/postgresql.conf

334:#effective_cache_size = 4GB

586:#gin_pending_list_limit = 4MB

697:temp_buffers = 64MB

714:log_rotation_size = 10MB

 

 

5.4.5 排序命令:sort,wc,uniq

1 sort

sort 选项 filename

-n 根据数字进行排序

-t 指定的分隔符

-k 指定分隔符的第几列

-r 降序排序

-u 去除重复行

2 sort事例

sort -ru /etc/passwd

3 wc

如果我想要知道/etc/man_db.conf 这个文件里面有多少字?多少行?多少字符的话,可以怎么做?其实可以利用wc这个命令来完成,它可以帮我们计算输出信息的整体数据。

[dmtsaicstudy ~]$ wC [-lwm]

选项与参数:

-l ;仅列出行;

-w:仅列出多少字(英文字母);

-m:多少字符;

 

[root@pg11m ~]# cat /etc/passwd | wc

     45      89    2352

[root@pg11m ~]# cat /etc/passwd | wc -l

45

5.4.6 xargs

xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。xargs 一般是和管道一起使用。

find /sbin -perm +700 |ls -l       #这个命令是错误的

find /sbin -perm +700 |xargs ls -l   #这样才是正确的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值