第十一章 bash命令

​man [command]     命令帮助

man -f [command] 查看[command]的说明文件        等价于   whatis

man -k [command] 说明文件中有关键字[command]的文件列出             等价于apropos         

who 查看有谁在线

netstat -a 查看网络联机状态

fsck /dev/sda7    fsck文件系统检查命令 

ls -al 列出所有文件的文件详细的权限与属性(包含隐藏文件)                                                                                             

uname -r 查看实际的内核版本



环境变量的功能:

变量的有效范围:环境变量=全局变量,自定义变量=局部变量。可以用export将局部变量编程全局变量

env    列出目前shell环境下的所有环境变量与其内容

HOME    用户主文件夹

SHELL    目前使用哪个shell程序

HISTSIZE    历史记录条数

MAIL     用户邮件存储路径

PATH    执行文件查找的路径,目录与目录之间以冒号(:)分割

LANG    语系数据

RANDOM    随机数变量

PS1    提示符的设置

$    关于本shell的PID,echo $$可以打出你的PID号码

?    关于上个命令执行的回传码,如果命令成功执行,则会回传一个0值,如果执行发生错误,返回一个非0值

export:自定义变量转成环境变量,如果仅执行export而没有接变量时,此时会把所有的“环境变量“显示出来,但仅对当前bash有效,如果要想永久生效,需要把变量写进/etc/profile中,或者~/.bashrc、~./bash_profile中

locale -a    显示出所有支持的语系




1.了解PS1

PS1是Linux终端用户的一个变量,但不是环境变量,用来定义命令行提示符的参数。


 在终端输入命令:

# set | grep PS1

 可得到当前PS1的定义值:

PS1='[\u@\h \W]\$ '


PS1的常用参数以及含义:

  \d :代表日期,格式为weekday month date,例如:"Mon Aug 1"

  \H :完整的主机名称

  \h :仅取主机名中的第一个名字

  \t :显示时间为24小时格式,如:HH:MM:SS

  \T :显示时间为12小时格式

  \A :显示时间为24小时格式:HH:MM

  \u :当前用户的账号名称

  \v :BASH的版本信息

  \w :完整的工作目录名称

  \W :利用basename取得工作目录名称,只显示最后一个目录名

  \# :下达的第几个命令

  \$ :提示字符,如果是root用户,提示符为 # ,普通用户则为 $

 所以linux默认的命令行提示信息的格式
   PS1='[\u@\h \W]\$ '  的意思就是:[当前用户的账号名称@主机名的第一个名字 工作目录的最后一层目录名]#

2.颜色设置参数

  在PS1中设置字符颜色的格式为:\[\e[F;Bm\],其中“F“为字体颜色,编号为30-37,“B”为背景颜色,编号为40-47。

  颜色对照表:

    F    B

    30  40 黑色

    31  41 红色

    32  42 绿色

    33  43 黄色

    34  44 蓝色

    35  45 紫红色

    36  46 青蓝色

    37  47 白色


        

        代码      意义

        0            OFF

        1            高亮显示

        4            underline            

        7            反白显示

        8            不可见

   只需将对应数字套入设置格式中即可。
  比如要设置命令行的格式为绿字黑底(\[\e[32;40m\]),显示当前用户的账号名称(\u)、主机的第一个名字(\h)、完整的当前工作目录名称(\w)、24小时格式时间(\t),可以直接在命令行键入如下命令:

# PS1='[\[\e[32;40m\]\u@\h \w \t]$ '

 经过多次测试后,最终确定了一个适合我自己的格式:

# PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "

 

 但注意这样的设置只是临时性的.

PS1="[\[\e[32;40m\]\u\[\e[36;40m\]@\h \[\e[36;40m\]\w]\\$\[\e[0;m\] "
//自己喜欢的样式

3.修改.bashrc文件,永久保存命令行样式.

  上面的设置的作用域只有当前终端的登陆有效,关闭终端或退出登录即刻失效。要想永久性的保存设置,需要修改.bashrc配置文件。

  键入命令:

1 # cd2 # ls -la

 

  现在可以看到.bashrc这个文件。

  编辑.bashrc:

# vim .bashrc

 

  加入这一行:

   PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ " 

  保存退出。

  重新加载bash配置文件:

# source .bashrc

 

  即可立即并永久生效了。



变量键盘读取、数组与声明:read,array,declare:

read    [-pt]    variable    读取来自键盘的输入

参数:

-p:后面可以接提示符

-t:后面可以接等待的秒数

例:

read atest;echo $atest

read -p "Please keyin your name:" -t 30 named;echo $named



declare/typeset    声明变量的类型,变量类型默认是字符串,bash环境中的数值运算,最多仅能达到整数类型

declare [-aixr] variable

参数:

-a:将后面名为variable的变量定义成为数组类型

-i:将后面名为variable的变量定义成为整数数字类型

-x:用法与export一样,将后面的variable变成环境变量,将减号(-)编程加号(+)可以让环境变量变为非环境变量

-r:将变量设置成为readonly类型,该变量不可被更改内容,也不能重设




变量内容的删除、替代与替换:


变量书写方式

功能描述

${变量名称#匹配字符}

若变量内容有被匹配到,刚从变量内容的左边开删除,但删除匹配最短的

${变量名称##匹配字符}

若变量内容有被匹配到,刚从变量内容的左边开删除,但删除匹配最长的,可理解成此时工作在贪婪模式

${变量名称%匹配字符}

若变量内容有被匹配到,刚从变量内容的右边开删除,但删除匹配最短的

${变量名称%%匹配字符}

若变量内容有被匹配到,刚从变量内容的右边开删除,但删除匹配最长的,可理解成此时工作在贪婪模式

${变量称/旧字符串/新字符串}

从变量内容的左边开始匹配,用新字符串替换旧字符串,仅替换第一个匹配到的字符串

${变量称//旧字符串/新字符串}

从变量内容的左边开始匹配,用新字符串替换旧字符串,全部替换匹配到的字符串


变量的测试与内容替换

${parameter:-word}

${}:关键字

parameter    变量

:-    关键字,被测试的选项

word    变量的替换内容

有没有冒号差异是很大的,加上冒号以后。被测试的变量未被设置或者是已被设置为空字符串时,都能够用后面的内容来替换和设置





变量配置方式 str 没有配置 str 为空字符串 str 已配置非为空字符串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str=expr}str=expr
var=expr
str 不变
var=
str 不变
var=$str
var=${str:=expr}str=expr
var=expr
str=expr
var=expr
str 不变
var=$str
var=${str?expr}expr 输出至 stderrvar=var=$str
var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str








bash的登录与欢迎信息:/etc/issue,/etc/motd

1、/etc/issue 
用   法:当我们在终端接口登录的时候,会有几行提示字符串,那么这个字符串就是设置在/etc/issue。 
[root@linux ~]#cat /etc/issue 
CentOS release 5.6 (Final) 
Kernel \r on an \m 

issue内各代码说明: 
\d  本地端时间的日期 
\l  显示第几个终端接口 
\m  显示硬件的等级 
\n  显示主机的网络名称 
\o  显示域名 
\r  操作系统的版本 
\t  显示本地端的时间 
\s  操作系统的名称 
\v  操作系统的版本 

2、/etc/motd 
用   法:如果想让用户登录后获取一些消息,比如想让大家都知道的消息,就可以加入这个文件,当登录后,告诉登录者,系统将会在某个时间进行维护。 
eg: 
[root@linux ~]#vi /etc/motd 
Hello everyone, 
Our server will be maintained at .... 
please don't login at that time,thanks. 
那么当用户登录的时候,就会显示设置的内容了。



z


bash默认组合键:

Ctrl+C    终止目前命令

Ctrl+D    输入结束,例如邮件结束

Ctrl+M    Enter

Ctrl+S    暂停屏幕的输出

Ctrl+Q    恢复屏幕的输出

Ctrl+U    在提示符下,将整行命令删除

Ctrl+Z    暂停目前的命令


通配符与特殊符号:

符号

意义

*

代表『 0 个到无穷多个』任意字符

?

代表『一定有一个』任意字符

[ ]

同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』

[ - ]

若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!

[^ ]

若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。


bash特殊符号:

符号

内容

#

批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行

\

跳脱符号:将『特殊字符或通配符』还原成一般字符

|

管线 (pipe):分隔两个管线命令的界定(后两节介绍);

;

连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)

~

用户的家目录

$

取用变量前导符:亦即是变量之前需要加的变量取代值

&

工作控制 (job control):将命令变成背景下工作

!

逻辑运算意义上的『非』 not 的意思!

/

目录符号:路径分隔的符号

>, >>

数据流重导向:输出导向,分别是『取代』与『累加』

<, <<

数据流重导向:输入导向 (这两个留待下节介绍)

' '

单引号,不具有变量置换的功能

" "

具有变量置换的功能!

` `

两个『 ` 』中间为可以先运行的命令,亦可使用 $( )

( )

在中间为子 shell 的起始与结束

{ }

在中间为命令区块的组合!



数据流重定向:

> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上

1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上

1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上

2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上

2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上

<:将原本需要由键盘输入的数据,改由文件内容来取代

<<:代表的是『结束的输入字符』 

<<<:将字符串重定向到stdin。


例:

  • 如果要将正确和错误的数据写在同一个文件内的话呢?

find /home -name .bashrc > list 2>&1

find /home -name .bashrc &> list 

  • 如果想将错误的信息丢弃,屏幕上只显示正确数据

find /home -name .bashrc 2> /dev/null

/dev/null可以吃掉任何导向这个设备的信息

  • 我要用 cat 直接将输入的信息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束,那我可以这样做:

1
2
3
4
5
6
7
8
[root@www ~]# cat > catfile << "eof" 
> This is a test
> OK now stop 
> eof  <==输入这关键词,立刻就结束而不需要输入 [ctrl]+d 
 
[root@www ~]# cat catfile 
This is a test
OK now stop
  •  cat > catfile < ~/.bashrc

    它代表将~/.bashrc的内容作为输入,然后将这些内容写入catfile


命令执行判断依据:

cmd;cmd    不考虑命令的相关性的连续命令执行

cmd1 && cmd2    若cmd1正确执行,则开始执行cmd2

cmd1 || cmd2    若cmd1执行完毕为错误,则开始执行cmd2



管道命令(pipe):

  • 管道命令|:

这个|仅能处理由前一个命令传来的正确信息,也就是standard output信息,对于standard error并没有直接处理能力,管道命令必须要能够接收来自前一个命令的数据成为standard input继续处理才行


  • 好用的less和tail

less

ls -al /etc | less就能用类似vi的方式浏览在屏幕上打印的内容了。还能用vi里的查找命令/?,可以避免滚屏,非常好用。

tail
  • tail filename输出文件最后10行

  • tail -n 5 filename输出文件最后5行

  • tail -F filename监视文件的改变,一有变化就显示出来

在分析error log的时候非常有用,可以查看最近的错误信息。


  • 选取命令:cut,grep:

cut 将一段信息的某一段切出来,处理的信息是以行为单位。

cut -d '分割字符' -f fieldscut -c 字符范围

参数:

-d : 后面接分隔符,与-f一起使用;

-f : 依据-d的分隔符将一段信息切割成为数段,用-f取出第几段的意思;

-c : 以字符(characters)的单位取出固定字符区间;

echo $PATH | cut -d ':' -f 3-5//将path的值按照':'进行分割,后取出第3到5个值export | cut -c 12-//对export的输出进行切分,每行输出从第12个字符往后的内容

 

grep 分析一行信息,如果有匹配的,就将该行拿出来。

grep [-acinv] [--color=auto] '查找字符串' filename

参数:

-a : 将binary文件以text文件的方式查找数据;

-c : 计算找到’查找字符串‘的次数;

-i : 忽略大小写的不同;

-n : 带行号;

-v : 反向选择,显示没有‘查找字符串’的行;

--color=auto : 可以将找到查找的关键字部分加上颜色显示

export | grep -in --color=auto 'bin'//列出export输出中带有bin的行,并给bin加上颜色,不区分大小写,带有行号。


  • 排序命令:sort,wc,uniq:

sort 可以依据不同的数据类型进行排序。

sort [-fbMnrtuk] [file or stdin]

参数:

-f : 忽略大小写

-b : 忽略最前面的空格符

-M : 以月份的名字来排序,如 JAN, DEC等

-n : 使用“数字”进行排序(默认是以文字类型来排序的)

-r : 反向排序

-u : uniq,相同的数据,仅出现一行代表

-t : 分隔符,默认是[Tab]来分割

-k : 用哪个filed来进行排序,与-t相关

cat /etc/passwd | sort -t ':' -k 3 -n//根据 passwd中每行,按':'分隔符进行分隔后,按照第3个字段使用纯数字的方式进行排序。

 

uniq 重复的行只显示一个

uniq [-ic]

参数:

-i : 忽略大小写

-c : 进行计数

last | cut -d ' ' -f1 | sort | uniq -c//列出登录者名字,并进行排序,进行统一处理,并计数。

 

wc 输出信息的整体数据

wc [-lwm]

参数:

-l : 仅列出行

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

-m : 多少字符

cat /etc/man.config | wc//输出三个数字,分表代表行,字数,字符数


  • 双向重定向:tee

tee 双重定向,存到文件/设备的同时,输出到屏幕以便继续处理。

tee [-a] file

参数:

[-a] : 以累加(append)的方式,输出到file中。

ls -l / | tee -a file.list | more//把文件目录输出到file.list中,同时用more将其输出到屏幕。

 

  • 字符转换命令:tr,col,join,paste,expand

tr 删除一段信息中的文字,或者进行文字信息的转换。

tr [-ds] XXX ...

参数:

-d : 删除信息中XXX这个字符串

-s : 替换掉重复的字符

last | tr '[a-z]' '[A-Z]'//将last输出的信息中所有的小写字母变成大写字母

 

col 对特殊字符进行处理

col [-xb]

参数:

-x : 将tab键转换成对等的空格键

-b : 在文字内有反斜杠(/)时,仅保留反斜杠最后接的那个字符

cat /etc/man.config | col -x | cat -A | more//将/etc/man.config内容中的[tab]转成空白,并输出。

 

join 将两个文件当中有相同数据的那一行加在一起。

join [-ti12] file1 file2

参数:

-t : join默认以空格符分隔数据,并且对比“第一个字段”的数据;如果两个文件相同,则将两条数据连成一行,且第一个字段放在第一个。

-i : 忽略大小写

-1 : (数字1),代表第一个文件要用哪个字段进行比较

-2 : 代表第二个文件要用哪个字段进行比较

join -t ':' -1 4 /etc/passwd -2 3 /etc/group//用分隔符':'进行分隔,第一个文件用第4个字段,第二个文件用第3个字段,进行分析。

 

paste 将两个文件贴在一起,中间以[tab]键隔开。

paste [-d] file1 file2

参数:

-d : 后面可以接分隔符,默认是以[tab]进行分隔

- : 如果file部分写成-, 表示来自standard input的数据的意思

cat /etc/group|paste /etc/passwd /etc/shadow - |head -n 3//先将/etc/group读出,然后与/etc/passwd和/etc/shadow合并的内容粘贴在一起,且仅取出前三行。

 

expand 将[tab]按键转成空格键

expand [-t] file

参数:

-t : 后面可以接数字,代表一个tab用几个空格表示


  • 切割命令:split:

split [-bl] file PREFIX

参数:

-b:后面可以接欲切割成的文件大小,可以加单位,b,k,m等

-l:以行数来进行切割

PREFIX:代表前导符,可作为切割文件的前导文字

# file文件名可以任意取,只要写上前导文字,小文件就回以xxxaa,xxxab,xxxac等方式来新建小文件的


  • 参数代换:xargs:

xargs 读入stdin的数据,并且以空格符或断行符进行分辨,将stdin的数据分隔为arguments。

xargs [-0epn] command

参数:

-0 : 如果输入的stdin含有特殊字符,如`,\,空格键等,这个参数可以将它还原成一般字符。

-e : 是EOF(end of file)的意思,后面可以接一个字符串,当xargs分析到这个字符串时,就停止继续工作。

-p : 在执行每个命令的参数时,都会询问用户的意见

-n : 后面接次数

cut -d ':' -f1 /etc/passwd | xargs -p -e'lp' finger//分析到lp这个字符串时,后面的其它stdin的内容就被xargs舍弃掉了。

举个例子

如果你想统计一个文件夹下java代码的文件数量

find [folderPath] -name "*.java" | wc -l

那如果我想查询所有java代码的行数呢?

可以用xargs,因为wc -l filename可以查询单个文件的行数

find [folerPath] -name "*.java" | xargs wc -l

如果要去掉空行

find [folderPath] -name "*.java" |xargs cat| grep -v ^$|wc -l


  • 关于减号-的用途:

连字符:年轻人称之为dash,年长者称之为minus,英文名称hyphen(连字符),minus sign(减号),或虚线

减号”-“就是代表标准输出/标准输入, 视命令而定. “-“代替stdin和stdout的用法,stdin就是标准输入,stdout就是标准。

1,为应用程序指定参数。
如ps -aux,tar -zxf test.tar

2.一个减号和两个减号

一个减号后面跟的参数必须是单字符参数,可以多个参数写在同一个减号后面。
例如:tar -xvf ×××

两个减号后面跟的参数必须是多字符参数,一个“–”只能跟一个参数。
例如:tar –version

3 表示上一级工作目录。如cd –
cd –

4 普通用户切换到root
su -相当于su – root

5、通过ssh传送文本
cat id_rsa.pub |ssh -p322 root@172.10.1.105 ‘cat – >> ~/.ssh/authorized_keys’

6、表示标准输出流。如tar -cvf – /home | tar -xvf –
tar -cvf – /home 把/home压缩后,打印在stdout上
| 管道,即前一命令的输出为后一命令输入
tar -xvf – 从stdin读取内容,并在当前目录解压

复制的例子
tar cf – access.log |tar xf – -C /opt

7、纯粹是演示 ‘-‘
grep -xvf a b 可以写成
cat a | grep -xvf – b

8、
脚本中可以这样在crontab里添加一个任务
{ crontab -l; echo “* * * * * /bin/date >> /tmp/log” ; } | crontab –

9、在文件头添加一行,也可以这样玩
cat – file <<<"line num 1"         ###有问题 至今没看懂

10、只取一列并与另一文件做diff awk '{ print $1 }' a | diff - b 11、例子, 在当前我要打包1个文件夹 /var/log/ 到当前目录下,并用zip压缩, 那么我们可以分步执行 #tar -cvf log.tar /var/log/ #zip -r log.tar.zip log.tar #rm -rf log.tar 写成一条语句就是 tar -cvf log.tar /var/log/ && zip -r log.tar.zip log.tar && rm -rf log.tar 那么我们可以发现第一条语句的输出(log.tar) 就是第二条语句的输入 这种情况下我们可以用 “-” 来取代这个输出输入 直接执行如下语句就ok了 tar -cvf - /var/log | zip -r log.zip - 意思就是 第一条语句不再输入到1个具体文件,而输出到stdout中, 而作为第二条件的标准输入(stdin), 而stdin 和 stdout都可以用“-”来取代。 这样的话就不会有中间文件生成了~








评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值