本文共 15858 字,大约阅读时间需要 52 分钟。
什么是shell
Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。
Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。
三种shell各有优缺点。Bourne shell是UNⅨ最初使用的shell,并且在每种UNⅨ上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
bash shell 是 Linux 的默认 shell
Bash sheel 执行命令
命令 选项 参数 shell每个基本的构成元素之间都相隔一个空格。
[root@Redhat7 ~]# ls -a /tmp/ 多个参数可以写在一起
[root@Redhat7 ~]# echo $SHELL
/bin/bash
[root@Redhat7 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
查询所执行的命令
History 当然上下键也可以
~/.bash_ history
在家目录下记载
Bash sheel 输入命令或者参数的前几个,按tab就可以补全。
[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’
[root@pg11m ~]# type ls
ls 是 `ls --color=auto' 的别名
使用最多的就是
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
命令别名将⽤户经常使⽤的复杂命令简单化, 可以⽤ "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个人用户环境变量
全局环境变量和个人用户环境变量=全局等于妈妈让你去相亲,个人最后做决定的还是你。
内部命令: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:属于用户个人设置,你要添加自己的数据,就写入这里;
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
//PATH由多个路径组成,每个路径值之间⽤冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找。
全局环境变量修改//修改PATH变量
[root@xuliangwei ~]# PATH=/soft/bin:$PATH //写⼊/etc/profile配置⽂件永久⽣效 echo 'export PATH=/soft/bin:$PATH' >> /etc/profile
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
[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"
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
* 代表匹配任意长度的字符
? 代表匹配任意单个字符
[ ] 代表指定范围的单子字符
;; 前面命令是否执行完成都会执行后面命令
&& 在前一个命令结束时,若返回值为 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
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
存在于内存空间中的,一组文字或符号组成,用于替代一些设置或数据,特别是复杂或变动的数据-变量最大的好处就是方便。
用户自定义变量、环境变量、位置变量、特殊变量。
只能作用于当前Shell,变量取值都是一个字符串
DAY=date “=”左右两边不能有空格
DAY=“today is date” 若含有空格,则需要加双引号
echo $DAY $调用变量,echo打印输出
unset DAY 删除变量
set 该命令查看系统所有变量
全局的,所有Shell都可以调用的变量
export DAY=date export命令就是将变量导出为环境变量
env env命令是查看系统所有的环境变量
环境变量PATH:为系统命令搜索的路径。
PATH="$PATH":/usr/sbin 即添加/usr/sbin目录也为PATH变量,若想要永久更改环境
变量,需要修改环境变量配置文件。
$n n为数字,$0代表命令本身,$1-$9代表第1-9个参数,10以上的需要用大括号${10},不能直接写$10
$* 代表命令行中所有参数,$*把所有参数当做一个整体
$@ 代表命令行所有参数,$@把每个参数区分对待
$# 代表命令行中参数的个数
$? 最后一次执行的命令的返回状态。若为0,则表示命令执行正确;若为非0,代表上一条指令执行错误。
$$ 当前进程的进程ID号
$! 后台运行的最后一个进程的进程号
变量的设置规则
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
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
[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
[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
单双引号
[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) //命令执行结果作为变量作为外部输入信息
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
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
不管是本地还是远程登录都能显示此信息。
可以使用export把自定义变量做出环境变量。
全局变量 global variable
局部变量 local variable
环境变量=全局变量
自定义变量=局部变量
export PATH=$PATH:$HOME/bin:$PGHOME/bin
不考虑相关性,连续执行。
Cmd;cmd
执行三遍sync同步磁盘,以后重启电脑
sync;sync;sync;reboot
命令1执行成功以后,命令2执行
[root@pg11m ~]# mkdir /tmp/abc
[root@pg11m ~]# ls /tmp/abc && touch /tmp/abc/syj
[root@pg11m ~]# ls /tmp/abc/
syj
命令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
在 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
[root@Redhat7 ~]# ifconfig >/root/syjjjj.txt
清空原有文件
[root@Redhat7 ~]# ifconfig >>/root/syjjjj.txt
在原有文件追加
[root@Redhat7 etc]# find /etc 1>/root/syj.txt 2>/root/jjj.txt
[root@Redhat7 etc]# ls /root >ab 2>/dev/null
重定向的输入是<.
[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
[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
管道操作符号 "|" 连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输⼊。
[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
[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]
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
cut 选项 字符串/文件
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
-b:仅显示行中指定字节范围的内容;
-c:仅显示行中指定字符范围的内容;
-n:与“-b”选项连用,不分割多字节字符;
cat /etc/passwd | cut -b1-3 #取每行的第1-3字字节
cat /etc/passwd | cut -d : -f 3 #以:分割,取第三段
date |cut -b 1-10 #以:分割,取第三段
根据专家指出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:递归查询子目录
[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'
[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'
[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
匹配行首包括#的字段
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
sort 选项 filename
-n 根据数字进行排序
-t 指定的分隔符
-k 指定分隔符的第几列
-r 降序排序
-u 去除重复行
sort -ru /etc/passwd
如果我想要知道/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
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。xargs 一般是和管道一起使用。
find /sbin -perm +700 |ls -l #这个命令是错误的
find /sbin -perm +700 |xargs ls -l #这样才是正确的
转载地址:http://gtbai.baihongyu.com/