bash指令学习与整理

基础知识

  1. 指令的历史记录位于~/.bash_history文件中,可以使用cat指令查看。需要注意的是,它存储的是上一次登录时执行过的命令,而这一次登录中执行的命令将先暂存在内存中
  2. Tab键可以用来补全命令或是提示可选的操作
  3. \可以用来换行增强指令的可读性
  4. 将根据环境变量PATH来寻找指令,可以使用echo $PATH来查看环境变量
  5. 在命令执行的过程中,反引号中的指令会先执行,执行的结果会作为外部的输入信息,$()具有同样的效果
  6. 命令执行顺序:以相对/绝对路径执行命令,以alias找到该命令来执行,由bash内置的命令来执行,通过$PATH的顺序找到第一个命令并执行
  7. 数据流重定向是指将某个指令执行后应该要出现在屏幕上的数据传输到其它地方。
  8. 直接执行和bash或sh执行脚本会在子进程中执行,而使用source执行脚本则会在父进程中执行

各种指令与例子

alias

alias: 显示所有的别名
alias lm='ls -al':设置别名为lm
unalias <COMMAND_NAME>: 取消别名

type

格式:type [-ta] name 可以通过type指令找到执行文件而不是一般的文件
type name: 显示name是外部指令还是bash内部指令
type -t name:外部命令则为file,别名命令则为alias,内置命令则为builtin
type -a name: 从PATH变量定义的路径中,将所有含name的命令都列出来,包括alias

echo

显示变量
echo $PATH:显示环境变量
echo $HOME: 显示当前用户的主目录
echo $MAIL: 显示当前用户的邮件目录
也可以直接赋值,赋值时需要注意等号两边不能直接接空格符,如果有空格符可以用双引号包住。如果希望累加则应当使用双引号,如name="$name"yes
unset VARIABLE:取消对VARIABLE的赋值
export VARIALBE: 导出变量使子进程也可以使用

env

查看所有的环境变量,如PATH,HOME,SHELL

set

不仅可以查看环境变量,还可以将bash内的其他变量全部显示出来,如HISTFILE,MAILCHECK,PS1
PS1的默认格式为'[\u@\h \W]\$'也就是我们通常看到的[rale@localhost ~]$这里参数的含义如下:
\d: 可显示出星期月日的格式
\H: 完整的主机名
\h: 仅取主机名在第一个小数点之前的名字
\t: 显示24小时格式的时间,格式为”HH:MM:SS”
\t: 显示12小时格式的时间
\A: 显示24小时格式的时间,格式为”HH:MM”
\@: 显示时间,格式为”am/pm格式”
\u: 目前用户的账户名称
\v: bash的版本信息
\w: 完整的工作目录
\W: 利用basename获取的工作目录名称,仅显示最后一个目录名
\#: 执行的第几个命令
\$: 提示符,如果是root,则为#,否则为$
可以使用如下指令PS1='[\u@\h \w \A #\#]\$'来修改PS1。

read

获取来自键盘的输入
read [-pt] variable
-p: 后面可以接提示符
-t: 后面可以接等待秒数
read -p "please enter your name: " -t 30 name

declare/typeset

声明变量的类型, 默认类型为字符串,且无法进行小数的运算
declare [-aixr] variable
-a: 将后面的变量定义为数组类型
-i: 将后面的变量定义为整数数字类型
-x: 将后面的变量定义为环境变量,等价于export
-r: 将变量设置为readonly
declare -i sum=100+100+50

history

history n: 显示最近n条命令
history -c: 将目前shell中所有history内容全部消除
history -a histfiles: 将目前新增的history命令新增入histfiles中。若灭有histfiles,则默认写入~/bash_history
history -r histfiles: 将histfiles的内容读入到目前这个shell的history记忆中
history -w histfiles: 将history的内容写入histfiles
!<number>:执行编号为number的指令
!command: 执行command开头的指令
!!: 执行上一个命令

source

读入环境配置文件的命令
source ENV_FILE
比如如果修改了~/.bashrc,无需退出重新登录,直接使用source指令即可。

last

查到这个月份有哪些用户登录了主机

数据流重定向

标准输入:代码为0,<或<<
标准输出:代码为1,>或>>
标准错误输出:代码为2,2>或2>>

单个符号代表重写,两个符号代表添加
find /home -name .bashrc > list 2>&1将两个输出写入到同一个文件时,要使用2>&1指令
cat > catfile: 创建一个文件,并将键盘输入的数据覆盖该文件,按[ctrl]+d结束输入
cat > catfile < ~/.bashrc将该文件的内容写入并覆盖catfile的内容
cat > catfile << "eof" 键盘输入eof时结束输入,eof并不会出现在文件中

管道命令

管道命令仅会处理标准输出,对于标准错误输出会予以忽略。管道命令必须要能够接收来自前一个命令的数据成为标准输入
管道命令有:less more head tail等

cut

以行为单位处理信息,将每行的数据进行分割并获取。但是在多空格的环境中使用效果不佳。
cut -d '分隔字符' -f fields 用于分隔字符
cut -c 字符范围 用于排列整齐的信息
echo $PATH | cut -d ':' -f 3,5 将$PATH根据:分割并且获取第3个值和第5个值
last | cut -d ' ' -f 1
export | cut -c 12-获取export每行12字符开始往后的值

grep

分析一行的数据,如果有所需要的数据,就将该行取出
grep [-acinv] [--color=auto] '查找字符串' filename
-a: 将binary文件以text的方式查找数据
-c: 计算找到’查找字符串’的次数
-i: 忽略大小写不同
-n: 输出行号
-v: 输出没找到关键字的行
--color=auto: 将关键字部分上色
last | grep 'root' 将last中出现root的行取出
last | grep -v 'root' 将last中没有root的行取出
last | grep 'root' | cut -d ' ' -f 1将包含root的行的第一个值取出来

sort

sort [-fbMnrtuk] [file or stdin]
-f: 忽略大小写
-b: 忽略最前面的空格符部分
-M: 以月份的名字来排序
-n: 使用纯数字排序
-r: 反向排序
-u: 相同数据仅出现一次
-t: 分隔符,默认为Tab键
-k: 以哪个区间进行排序
cat /etc/passed | sort -t ':' -k 3 -n将输入的每一行按照:分割并根据第三列进行排序,并且将第三列作为数字来排序,默认为字符串排序

uniq

删去重复的行进行统计
uniq [-ic]
-i: 忽略大小写
-c: 计数
last | cut -d ' ' -f 1 | sort | uniq
last | cut -d ' ' -f 1 | sort | uniq -c获取最近登录用户的登录次数

wc

统计文件的行数,字数和字符数
wc [-lwm]
-l 仅列出多少行
-w 仅列出多少字
-m 多少字符
cat /etc/man.config | wc 会输出该文件的行数,字数和字符数
last | grep [a-zzA-z] | grep -v 'wtmp' | wc -l 知道最近登录的用户数,除去空白行和wtmp行

tee

双向重定向,即可以将一个标准输出转存一份到文件内并将同样的数据继续送到屏幕去处理
tee [-a] file -a会以累加的方式
last | tee last.list | cut -d " " -f 1将last的内容转存一份到last.list

tr

删除一段信息中的文字,或是进行文字信息的转换
tr [-ds] SET1...
-d 删除信息中SET1这个字符串
-s 替换掉重复的字符
last | tr '[a-z] [A-Z]'将last中的所有小写字符变成大写字符
cat /etc/passwd | tr -d ':' 将输出信息中的冒号删除

col

常用于替换tab键或是将man page转存为纯文本文件以方便查阅的功能。
col [-xb]-x将tab转换为对等的空格键,-b在文字内有反斜杠/时,仅保留反斜杠后面接的字符

join

将两个文件中有相同数据的那一行加在一次。特别注意使用join前应当对文件进行排序,否则有些对比的项目会被略过
join [-ti12] file1 file2
-t: 分隔符,默认以空格符分割数据,并且对比第一个字段的数据,如果两个文件相同,则将两条数据连成一行,并且第一个字段放在第一个
-i: 忽略大小写差异
-1: 代表第一个文件要用哪个字段来分析
-2: 代表第二个文件要用哪个字段来分析
join -t ':' -1 4 -2 3 /etc/passwd /etc/group将两个文件按照:分割,第一个文件采用第4个作为比较符,第二个文件采用第3个作为比较符

paste

直接将两行粘在一起,且中间以tab键隔开
paste [-d] file1 file2 -d表示分隔符,默认为tab。如果file的部分写为-,则表示来自标准输入的数据
cat /etc/group | paste /etc/passwd /etc/shadow - | head -n 3

expand

将tab键转化为空格键
expand [-t] file-t后面表示空格的个数,默认为8个空格键替换
grep '^MANPATH' /etc/man.confg | head -n 3 | expand -t 6 - | cat -A此时的输出将不会出现tab键
unexpand会将空格转换为tab

split

将一个大文件依据文件大小或是行数来切割为小文件
split [-bl] file PREFIX
-b 欲切割的文件大小,可加单位如b,k,m
-l 以行数来切割
PREFIX: 作为切割问价你的前导文字
cd /tmp; split -b 300k /etc/termcap termcap将文件切割为不超过300k的子文件,子文件的前缀为termcap
cat termcap* >> termcapback 将子文件合并
ls -al / | split -l 10 - lsroot将结果按照每十行记录为一个文件

sed

可以分析standard input,还可以将数据进行替换、删除、新增、选取特定行等
sed [-nefr] [动作]
-n 使用安静模式,在一般的sed中,所有来自stdin的数据一般都会被列出到屏幕,该模式只会列出经过sed特殊处理的那一行
-e直接在命令行模式上进行sed的动作编辑
-f将sed动作写入一个文件
-r正则表示式语法
-i直接修改读取的文件内容,而不是由屏幕输出
[n1][,n2]function
nl /etc/passwd | sed '2,5d'列出/etc/passwd并删除2到5行
nl /etc/passwd | sed '2,$d'列出/etc/passwd并删除第2行至最后一行
nl /etc/passwd | sed '2a hello world'在第二行后的一行添加hello world,可以通过反斜线添加多行
nl /etc/passwd | sed '2,5c No 2-5 line将2到5行替换为No 2-5 line
sed 's/要被替换的字符串/新的字符串/g'进行逐行的正则替换操作

egrep

支持扩展的正则表达式检索,包括+,?,|,(),()+
正则表达式详情请参考这篇文章

printf

格式化打印
printf '打印格式' 实际内容

awk

将一行分为数个字段来处理,默认的字段的分隔符为空格或是tab键。它适合处理小型的数据
awk '条件类型1'{动作1} '条件类型2'{动作2}... filename
NF: 每一行拥有的字段数
NR: 目前awk在处理第几行数据
FS: 目前的分割字符,默认为空格键
awk后序的所有动作都以单引号括住,非变量的文字部分都需要用双引号定义
last -n 5 | awk '{print $1 "\t lines:" NR "\t columns: " NF}' 按照默认的空格划分一行为多个字段,打印第一个字段,以及目前在第几行和每一行拥有几个字段
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' 按照:分割,取出第三个字段小于10的内容

diff

以行为单位比较两个文件的区别,通常用在同一文件的新旧版本上的区别。
diff [-bBi] from-file to-file
-b: 忽略一行当中仅有多个空白的区别,如about meabout me为相同的
-B: 忽略空白行的区别
-i: 忽略大小写

参考书籍

鸟哥的linux私房菜

《bash指令学习与整理》
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

    原文作者:raledong
    原文地址: https://segmentfault.com/a/1190000014399903
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞