Linux 系统Bash的常用功能

news2025/1/12 6:06:23

了解了基本的Linux文件文件系统的概念后,我们将更深入的了解一下Linux的其他方面的内容,那就是我们所使用的用户接口,也就是大家常听到的 Shell ,是一种Linux的命令接口,在 Linux 的世界中,默认使用的是 GNU 开发出来的 shell ,称为 BASH Shell,简单来说,我们之前使用的几个命令都是 bash 管理的,除此之外,bash还具备记录命令、文件或命令的补全功能、环境变量的使用等,下面我们会介绍bash的发展以及常用的特性.本章的内容,是一个呈上启一下的东西,在以后的主机维护中作用很大,务必掌握.

系统中的默认合法Shell

在Linux系统中,常用的shell可以在/etc/shells文件中查到.
● /bin/sh (已经被 /bin/bash 所取代)
● /bin/bash (就是 Linux 默认的 shell)
● /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
● /bin/tcsh (整合 C Shell ,提供更多的功能)
● /bin/csh (已经被 /bin/tcsh 所取代)
● /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)

上面我们可以看到有很多Shell的程序,我们作为初学者,最应该掌握的就是Bash,因为他是系统的默认Shell,还有一些特殊的Shell这里没有列出,比如:/sbin/nologin这个无法登陆的Shell.

Bash-Shell的常用功能

既然 /bin/bash 是 Linux 默认的 shell 那么总是得了解一下这个Shell有哪些特性吧,bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux 发行版的标准 shell ,bash 兼容于 sh ,下面我们看一下bash到底有哪些特点吧,好让我们以后的使用更加得心应手.

● 命令记忆功能(history)
在默认的Linux环境中,我认为Bash最赞的功能,就是它的命令记忆功能了,其默认的记忆功能,可达到记忆1000条命令,也就是说,你曾经执行过的命令1000条以内会被记录下来,超出部分会自动清除.
你或许会有个疑问,命令被记录到哪里了呢?其实我们的命令在退出终端是是记录在内存中的,当用户正式退出终端是会自动写入到,自己家目录,名字为.bash_history文件当中.虽然我们可以自己设置记录条数,但是建议设置条目小一些,因为一旦你的系统被黑客入侵,那么他可以通过翻阅你的命令执行找到一些核心数据.

● 命令与文件补全(TAB)
在使用Linux时,有时候我们会忘记一些命令的具体参数,此时我们可以通过命令补全功能,来实现补全.补全的按键是TAB.灵活运用命令补全功能,不但可以提高输入效率,还能减小误输入概率.实在是,棒棒哒!

● 命令别名(alias)
有时候我们需要给指定命令设置别名,比如说,一个命令过长,我们可以使用Bash提供的这一特性来将其简化一下.

● Bash程序脚本(Shell)
在Linux上面,Shell脚本发挥着及其强大的功能,我们的主机管理,日常维护,都离不开Shell脚本的支持.

● Shell通配符
除了以上功能外,BASH还支持很多简单的通配符,这对于我们的维护减小了很大的负担.

Bash-Shell常用命令

好了,看了这么多理论,是不是有点懵圈,没关系,我也懵了,不过接下来,我们来点干货,开始实战,看一下Bash常用的相关命令吧.前面的理论可以不看,会操作就行.

alias 设置别名

alias命令用来设置指令的别名,我们可以使用该命令可以将一些较长的命令进行简化,使用alias时,用户必须使用单引号’'将原来的命令引起来,防止特殊字符导致错误,alias命令的作用只局限于该次登入的操作,若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件 /etc/bashrc 中,如果是对指定用户生效则要写入用户家目录中的 ~/.bashrc 中.

这里我不得不罗嗦一下,关于不同类型命令的执行顺序,面试时可能会问到.
NO.1 用绝对路径或相对的方式执行命令
NO.2 别名命令
NO.3 bash 内置命令
NO.4 根据环境变量定义的目录查询找到的命令

[root@localhost ~]# alias --help

命令语法:[ alias [原命令]="新命令" ]

        -p              #打印已经设置的命令别名

[root@localhost ~]# unalias --help

命令语法:[ unalias [命令] ]

history 历史命令

history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件,该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令.例如:要执行第2个历史命令,则输入!2.

历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取.在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制.

[root@localhost ~]# history --help

命令语法:[ history [选项] ]

        -c              #清空当前历史命令
        -a              #将历史命令缓冲区中命令写入历史命令文件中
        -r              #将历史命令文件中的命令读入当前历史命令缓冲区
        -w              #将当前历史命令缓冲区命令写入历史命令文件中
        "!n"            #重复执行第n条历史命令
        "!!"            #重复执行上一条命令
        "!字符"         #重复执行最近一条以此字符开头的命令

ulimit 磁盘限制

ulimit命令用来限制系统用户对shell资源的访问,想象一个状况:我的 Linux 主机里面同时登陆了十个人,这十个人不知怎么搞的,同时开启了 100 个文件,每个文件的大小约 10MBytes,请问一下,我的 Linux 主机的内存要有多大才够,10*100*10 = 10000 MBytes = 10GBytes这样我们的Linux就完蛋了,为了要预防这个情况的发生,所以我们的 bash 是可以『限制用户的某些系统资源』的,包括可以开启的文件数量,可以使用的 CPU 时间,可以使用的内存总量等等.

[root@localhost ~]# ulimit --help

命令语法:[ ulimit [选项] ]

        -c              #清空当前历史命令
        -H              #严格限制,不能超过此限制
        -S              #宽限模式,可超过,超过后有警告
        -a              #列出所有系统限额信息
        -f              #此Shell可创建的最大容量,默认KB
        -d              #进程可用最大断裂内存(seqment)容量
        -l              #可用于锁定的内存(lock)量
        -t              #可使用最大CPU时间,(单位为秒)
        -u              #单一用户可使用最大进程数量

来看一下它的结果的解析吧.

[root@localhost ~]# ulimit -a

core file size          (blocks, -c) 0           #core文件的最大值为100 blocks
data seg size           (kbytes, -d) unlimited   #进程的数据段可以任意大
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited   #文件可以任意大
pending signals                 (-i) 98304       #最多有98304个待处理的信号
max locked memory       (kbytes, -l) 32          #一个任务锁住的物理内存的最大值为32KB
max memory size         (kbytes, -m) unlimited   #一个任务的常驻物理内存的最大值
open files                      (-n) 1024        #一个任务最多可以同时打开1024的文件
pipe size            (512 bytes, -p) 8           #管道的最大空间为4096字节
POSIX message queues     (bytes, -q) 819200      #POSIX的消息队列的最大值为819200字节
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240       #进程的栈的最大值为10240字节
cpu time               (seconds, -t) unlimited   #进程使用的CPU时间
max user processes              (-u) 98304       #当前用户同时打开的进程(包括线程)的最大个数为98304
virtual memory          (kbytes, -v) unlimited   #没有限制进程的最大地址空间
file locks                      (-x) unlimited   #所能锁住的文件的最大个数没有限制

Bash-Shell操作环境

是否记得我们登陆主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的,还有登陆的时候我们还可以给予用户一些信息或者欢迎文字,此外,我们习惯的环境变量、命令别名等等的,是否可以登陆就主动的帮我配置好,这些都是需要注意的,下面我们就来介绍一下吧.

关于Bash的登陆tty终端提示信息

其实我们的Bash也有登陆提示信息的,细心的你也会发现,当我们登陆Linux系统时,默认会提示,Linux的版本等相关信息,这些登陆tty的相关信息是在 /etc/issue 这个配置文件中保存的,我们可以看一下它的结构.

[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m

上图可以看到,里面默认有三行,issue里面的内容,是可以使用反斜杠作为变量调用的,我们下面来具体看一下它所支持的的代码.

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

如果我们想定制自己的登陆界面的话,我们可以修改这个配置文件,制作出属于自己的登陆界面.此时你还需要注意的是,除了issue文件外,还有一个issue.net的配置文件,这个是提供给telnet的远程登陆程序用的,当用户用telnet方式登陆主机时,就会自动读取 /etc/issue.net 这个配置文件里的信息,并输出到屏幕上.

关于Bash通过SSH登陆的提示信息

如果,你想让通过SSH登陆的用户,登陆成功后取得一些信息的话,那么可以讲信息加入到 /etc/motd 这个文件里,当用户下次登陆时,就会默认显示里面的内容.

例如,我们写入警告信息,让每个登陆用户下次登陆自动显示.

[root@localhost ~]# cat /etc/motd
===============================================================
警告:您的操作已被记录
===============================================================

接下来我们通过 ssh 来模拟登陆一下,看一下效果.

[root@localhost ~]# ssh root@192.168.1.10
root@192.168.1.10 password:

Last failed login: Sat Nov 24 15:28:30 EST 2018 from 192.168.1.20 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sat Nov 24 15:26:36 2018 from 192.168.1.20
================================================================
警告:您的操作已被记录
===============================================================

Bash的环境配置文件,与相关调用顺序

你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了,这是因为系统有一些环境配置文件案的存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作环境,而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好配置文件.接下来,我们就来看看常用的配置文件以及调用顺序吧.

/etc/profile

这是一个系统全局配置文件,每个用户登录取得Bash时一定会读取次配置文件,加载一些配置参数,当此配置文件执行的时候还会调用其他的配置文件,比如下面的这几个.

/etc/profile首先调用/etc/inputrc

其实这个文件并没有被运行,/etc/profile 会主动的判断使用者有没有自定义输入的按键功能,如果没有的话,/etc/profile 就会决定配置『INPUTRC=/etc/inputrc』这个变量,此一文件内容为 bash 的热键啦、[tab]要不要有声音啦等等的数据.不建议修改这个文件

/etc/profile其次调用/etc/profile.d/.sh

这个目录内有很多文件,只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh 并且使用者能够具有读权限那么该文件就会被 /etc/profile调用,如果你需要帮所有使用者配置一些共享的命令别名时,可以在这个目录底下自行创建扩展名为 .sh 的文件,并将所需要的数据写入即可.

上面的说明,我们可以看出,其实只有 /etc/profile 被调用啦,但是 /etc/profile 还会调用出其他的配置文件,所以让我们的 bash 操作接口变的非常的友善啦.

~./bash_profile

bash 在读完了整体环境配置的 /etc/profile 并借此调用其他配置文件后,接下来则是会读取使用者的个人配置文件.所读取的个人偏好配置文件其实主要有三个,依序分别是:
~/.bash_profile --> ~/.bash_login --> ~/.prifile

其实 bash 只会读取上面三个文件的其中一个,而读取的顺序则是依照上面的顺序,也就是说,如果 ~/.bash_profile 存在,那么其他两个文件不论有无存在,都不会被读取.如果 ~/.bash_profile 不存在才会去读取 ~/.bash_login,而前两者都不存在才会读取 ~/.profile 的意思.

~/.bash_history

默认的情况下,我们的历史命令就记录在这里,而这个文件能够记录多少数据,则与 HISTFILESIZE 这个变量有关,每次登陆 bash 后,bash 会先读取这个文件,将所有的历史命令读入内存,因此当我们登陆 bash 后就可以查看以前使用过的命令啦.

~/.bash_logout

当系统用户注销时,系统会读取此配置文件,你可以去读取一下这个文件的内容,默认的情况下注销时bash 只是帮我们清掉屏幕的信息而已.不过,你也可以将一些备份或者是其他你认为重要的工作写在这个文件中(例如清空缓存盘),那么当你离开 Linux 的时候,就可以解决一些烦人的事情.

具体的调用情况,下面一张图,搞定.

1.首先执行主配置下的:/etc/profile
2.执行主配置目录下的:/etc/profile.d/*.sh
3.执行当前家目录下的:~/.bash_profile
4.执行当前家目录下的:~/.bashrc
5.最后执行主配置下的:/etc/bashrc

以上就是,系统加载环境变量的全部过程!

Shell快捷键与通配符

Bash 常用快捷键

Bashe这个默认shell支持一些,比较常用的快捷键,这些快捷键,对于命令行下的操作,大有好处,你应该好好掌握这些按键.

快捷键作用
ctrl+A将光标移动到命令开头
ctrl+E将光标移动到命令结尾
ctrl+C强制终止当前命令
ctrl+L清屏
ctrl+U删除或剪切光标之前的命令
ctrl+K删除或剪切光标之后的命令
ctrl+Y粘贴,ctrl+U或ctrl+K的内容
ctrl+R在历史命令中搜索,按下后会出现搜索命令
ctrl+D退出当前终端
ctrl+Z暂停,并放入后台
ctrl+S暂停屏幕输出
ctrl+Q恢复屏幕输出

Bash 常用通配符

通 配 符作 用
?匹配任意一个字符
*匹配0个或多个任意字符,也就是可以匹配任何内容
[]匹配括号内的任意一个字符 例如:[abc],在abc中任选一个
[-]匹配一定范围的字符 例如:[a-z],在a-z之间的都可以被匹配
[^]逻辑非,匹配不包括,括号内的字符
1匹配开头是,括号内的字符
[]匹配开头不是,括号内的字符

**实例1:**使用 ? 匹配任意一个字符,匹配开头任意一个字符,只能匹配一个字符.

[root@localhost ~]# ls
123  1233  12333  abbc  abc  abcc  abccc  admin  lyshark  multiuser  rui  sec  wang

[root@localhost ~]# ls ?ang
wang

**实例2:**使用 * 匹配0个或多个任意字符,也就是可以匹配任何内容

[root@localhost ~]# ls
123  1233  12333  abbc  abc  abcc  abccc  admin  lyshark  multiuser  rui  sec  wang

[root@localhost ~]# ls *
123  1233  12333  abbc  abc  abcc  abccc  admin  lyshark  multiuser  rui  sec  wang

[root@localhost ~]# ls *ang
wang

**实例3:**使用 [-] 匹配范围,匹配一个范围

[root@localhost ~]# ls
123  1233  12333  abbc  abc  abcc  abccc  admin  lyshark  lyssark  multiuser  rui  sec  wang

[root@localhost ~]# ls lys[a-z]ark
lyshark  lyssark

**实例4:**使用 ^[] 匹配开头是0-9的任意字符

[root@localhost ~]# ls
123  1233  12333  abbc  abc  abcc  abccc  admin  lyshark  lyssark  multiuser  rui  sec  wang

[root@localhost ~]# ls [0-9]*
123  1233  12333

**实例5:**使用 ^[^] 匹配开头不是0-9的任意字符

[root@localhost ~]# ls
123  1233  12333  abbc  abc  abcc  abccc  admin  lyshark  lyssark  multiuser  rui  sec  wang

[root@localhost ~]# ls [^0-9]*
abbc  abc  abcc  abccc  admin  lyshark  lyssark  multiuser  rui  sec  wang

bash 特殊通配符

符 号作 用
‘’单引号:在单引号中的内容,全部会脱意,它是脱意字符.
“”双引号:双引号内,拥有$调用变量,引用命令,和转义符的特殊含义.
``反引号:反引号内会被当成命令解析,先执行
$()$加括号:同反引号作用相同,执行解析命令
()小括号:用于命令执行,小括号中的命令会在子shell中执行
{}中括号:用于命令执行,中括号中的命令会在当前shell中执行
[]大括号:用于测试变量
#警号:在shell脚本中,警号表示注释
$$符号:用于调用变量值
\转义符:用于转义\之后的内容不被执行

单引号与双引号: 单引号当中的特殊字符被脱意了,而双引号也是脱意,但是$和\不会脱意

[root@localhost ~]# name=lyshark

[root@localhost ~]# echo '$name'
$name

[root@localhost ~]# echo "$name"
lyshark

[root@localhost ~]# echo "{{{ lyshark"
{{{ lyshark

单引号与反引号: 单引号和双引号会脱意,在双引号中的反引号会执行

[root@localhost ~]# echo 'date'
date

[root@localhost ~]# echo "date"
date

[root@localhost ~]# echo '`date`'
`date`

[root@localhost ~]# echo "`date`"
Sun Sep 23 22:56:34 EDT 2018

[root@localhost ~]# echo $(date)
Sun Sep 23 22:56:46 EDT 2018

**反引号与 ( ) ∗ ∗ 关于反引号 , 和 ()** 关于反引号,和 ()关于反引号,()两种都是命令执行

[root@localhost /]# echo ls
ls

[root@localhost /]# echo `ls`
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

[root@localhost /]# echo $(ls)
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

关于小括号,中括号,和大括号的说明
● ()执行一串命令时,需要重新开一个子shell进行执行
● {}执行一串命令时,是在当前shell执行
● ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
● ()最后一个命令可以不用分号
● {}最后一个命令要用分号
● {}的第一个命令和左括号之间必须要有一个空格
● ()里的各命令不必和括号有空格

小括号: ()执行命令时,新开一个子shell执行

[root@localhost ~]# name=lyshark

[root@localhost ~]# ( name=bash;echo $name )
bash

[root@localhost ~]# echo $name
lyshark

中括号:{}执行命令时,会在当前shell中执行

[root@localhost ~]# name=lyshark

[root@localhost ~]# { name=bash;echo $name; }
bash
[root@localhost ~]# echo $name
bash
[root@localhost ~]#

Shell的数据流重定向

|设备|设备文件名 | 文件描述符 | 类型 |
|:---------|:----------|:---------|
| 键盘 | /dev/stdin | 0 | 标准输入 |
| 显示器 | /dev/stdout | 1 | 标准正确输出 |
| 显示器 | /dev/stderr | 2 | 标准错误输出 |
| 垃圾桶 | /dev/null | 3 | 垃圾桶 |

类型符号作用
标准输出重定向命令 > 文件以覆盖的方式,把命令的正确输出输出到指定文件或设备中
命令 >> 文件以追加的方式,把命令的正确输出输出到指定的文件或设备当中
标准错误输出重定向错误命令 2 > 文件以覆盖方式,把命令的错误输出输出到指定的文件或设备中
错误命令 2>> 文件以追加的方式,把命令的错误输出输出到指定文件或设备中
正确输出和错误输出同时保存命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出同时保存到一个文件中
命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出同时保存到一个文件中
命令 &>文件以覆盖的方式,把正确输出和错误输出同时保存到同一个文件中
命令 &>>文件以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件1 2>>文件2把正确的输出追加到文件1中,把错误输出追加到文件2中

本小结内容相当的简单,这里就不再介绍了.结束

Bash-Shell管道命令

sort 排序命令

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出,sort命令既可以从特定的文件,也可以从stdin中获取输入.

[root@localhost ~]# sort --help

语法格式:[ sort [选项] ]

        -a              #显示所有文件,包括隐藏文件,连同.与..的文件也列出来
        -f              #忽略大小写
        -b              #忽略每行前的空白部分
        -n              #以数值型进行排序,默认使用字符串类型排序
        -r              #反向排序
        -u              #删除重复行(=下面的uniq)
        -t              #指定分隔符,默认分割符是制表符
        -k n[,m]        #按照指定字段范围排序,从n字段开始到m字段结束

实例1: sort 命令默认使用每行开头第一个字符进行排序

[root@localhost ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
....省略....

实例2: 进行反向排序则需要加 -r 选项

[root@localhost ~]# sort -r /etc/passwd
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
root:x:0:0:root:/root:/bin/bash
....省略....

实例3: 按照指定的排序字段进行字符排序,使用 -t 指定分割符,并且使用 -k 指定段号

[root@localhost ~]# sort -t ":" -k 3 /etc/passwd     #以:作为分隔符,排序是按照第三段排列
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
....省略....

实例4: 上面的例子,排序方式是字符排序,而加上 -n 之后成为了数值排序

[root@localhost ~]# sort -n -t ":" -k 3 /etc/passwd
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
....省略....

[root@localhost ~]# sort -n -t ":" -k 3,4 /etc/passwd
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
....省略....

wc 字数统计

wc命令用来计算数字,利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为"-" 则wc指令会从标准输入设备读取数据.

[root@localhost ~]# wc --help

语法格式:[ wc [选项] 文件名 ]

        -c              #统计字数(字符)
        -w              #统计单词数(字符串)
        -l              #统计行数

uniq 取消重复行

uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用.

[root@localhost ~]# uniq --hlep

语法格式:[ uniq [选项] ]

        -i              #忽略大小写
        -c              #在每列旁边显示该行重复出现的次数
        -d              #仅显示重复出现的行列
        -f              #忽略比较指定的栏位
        -s              #忽略比较指定的字符
        -u              #仅显示出一次的行列
        -w              #指定要比较的字符

实例1: 单独过滤,不排序,uniq命令只能过滤紧挨着的重复行

[root@localhost ~]# cat lyshark.log
123123
123123

qwrtyyu
sasdfgh
1234wsx
123123
ffffgh
123123

[root@localhost ~]# cat lyshark.log |uniq
123123

qwrtyyu
sasdfgh
1234wsx
123123
ffffgh
123123

实例2: 先排序再过滤,既可以过滤掉所有重复行

[root@localhost ~]# cat lyshark.log
123123
123123

qwrtyyu
sasdfgh
1234wsx
123123
ffffgh
123123

[root@localhost ~]# cat lyshark.log | sort |uniq

123123
1234wsx
ffffgh
qwrtyyu
sasdfgh

tr 文本转换命令

tr命令可以对来自标准输入的字符进行替换、压缩和删除,它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大.

[root@localhost ~]# tr --hlep

语法格式:[ tr [选项] ]

        -d              #删除信息中的,SET1这个字符串.
        -s              #替换掉重复字符串
        -c              #取代所有不属于第一字符集的字符
        -t              #先删除第一字符集较第二字符集多出的字符

实例1: 将last命令中的小写字符,全部变成大写(小写->大写)

[root@localhost ~]# who
root     pts/0        2018-11-25 07:43 (192.168.1.20)

[root@localhost ~]# who | tr '[a-z]' '[A-Z]'
ROOT     PTS/0        2018-11-25 07:43 (192.168.1.20)

实例2:/etc/passwd 中的冒号全部删除

[root@localhost ~]# cat /etc/passwd | tr -d ":"

rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin
admx34adm/var/adm/sbin/nologin
lpx47lp/var/spool/lpd/sbin/nologin
....省略....

col 文本过滤器

col命令是一个标准输入文本过滤器,它从标注输入设备读取文本内容,并把内容显示到标注输出设备.在许多UNIX说明文件里,都有RLF控制字符.当我们运用shell特殊字符>和>> 把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col命令则能有效滤除这些控制字符.

[root@localhost ~]# col --help

语法格式:[ tr [选项] ]

        -x              #将TAB键转换为对等的空格
        -b              #过滤掉所有的控制字符,包括RLF和HRLF

join 连接文件

join命令用来将两个文件中,制定栏位内容相同的行连接起来.找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备.

[root@localhost ~]# join --help

语法格式:[ join [选项] ]

        -t              #默认以空格符分割数据
        -i              #忽略大小写差异
        -1              #代表第一个文件用那个字段来分析
        -2              #代表第二个文件用那个字段来分析

实例:/etc/passwd/etc/shadow相同的行,连接在一起

[root@localhost ~]# head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/shadow <==
root:$6$gMIJWbnKgxk.lpzY$t3l0u.PNORfSTrjLIdizynMF5uA8LwnSth1tGS/2/89sPiMjVMGdKBPtmUNPYeaeeNRky..xh9Y7FS6LGqSu1/::0:99999:7:::
bin:*:17492:0:99999:7:::
daemon:*:17492:0:99999:7:::


[root@localhost ~]# join -t ":" /etc/passwd /etc/shadow |head -n 3

root:x:0:0:root:/root:/bin/bash:$6$gMIJWbnKgxk.lpzY$t3l0u.PNORfSTrjLIdizynMF5uA8LwnSth1tGS/2/89sPiMjVMGdKBPtmUNPYeaeeNRky..xh9Y7FS6LGqSu1/::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:17492:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:17492:0:99999:7:::

paste 连接文件

这个命令,相对于join就简单多了,paste是直接将两个文件贴在一起,且中间以TAB隔开而已.

[root@localhost ~]# paste --help

语法格式:[ paste [选项] ]

        -d              #后面可接分隔符,默认是TAB来分割

实例: 实现文本的连接

[root@localhost ~]# paste /etc/passwd /etc/shadow | head -n 3

root:x:0:0:root:/root:/bin/bash root:$6$gMIJWbnKgxk.lpzY$t3l0u.PNORfSTrjLIdizynMF5uA8LwnSth1tGS/2/89sPiMjVMGdKBPtmUNPYeaeeNRky..xh9Y7FS6LGqSu1/::0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:17492:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:17492:0:99999:7:::

expand 转空格

expand命令用于将文件的制表符(TAB)转换为空白字符(space),将结果显示到标准输出设备.

[root@localhost ~]# expand --help

语法格式:[ expand [选项] ]

        -t              #后面接数字,转换成几个空格

split 文本切割

split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等.

[root@localhost ~]# split --help

语法格式:[ split [选项] [大小] [文件] ]

        -b              #后面可跟切割大小,可跟b,m,k
        -l              #以行数来进行切割

xargs 代数转换

xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具,它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数.xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行.xargs的默认命令是echo,空格是默认定界符,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代.xargs是构建单行命令的重要组件之一.

[root@localhost ~]# xargs --help

[小例子]

[root@localhost ~]# echo "-lh" |ls
anaconda-ks.cfg

[root@localhost ~]# echo "-lh" |xargs ls
total 4.0K
-rw-------. 1 root root 1.2K Sep 18 09:12 anaconda-ks.cfg

实例1: 通过使用 xargs 将多行文本转换成单行

[root@localhost ~]# cat lyshark.log

a b c d e f g
h i j k l m n

[root@localhost ~]# cat lyshark.log | xargs

a b c d e f g h i j k l m n

实例2: 通过 xargs -n 指定每行打印的行数

[root@localhost ~]# cat lyshark.log

a b c d e f g
h i j k l m n

[root@localhost ~]# cat lyshark.log | xargs -n3

a b c
d e f
g h i
j k l
m n

实例3: 通过 xargs -d 指定一个限定符

[root@localhost ~]# echo "nameXnameXnameXname" | xargs -dX

name name name name

[root@localhost ~]# echo "nameXnameXnameXname" | xargs -dX -n2

name name
name name

  1. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10.JS笔记-对象

1、什么是对象 对象是一个具体的事物&#xff0c;在js中&#xff0c;对象是一组无序的属性和方法的集合 属性&#xff1a;事物的特征 方法&#xff1a;事物的行为 2、创建对象 利用字面量创建对象利用new Object创建对象利用构造函数创建对象 2.1 变量、属性和方法、函数的…

人工智能的核心技术是什么?

&#xff08;本文阅读时间&#xff1a;5分钟&#xff09;人工智能的核心技术是它的算法被广泛认可的「算法」专业定义是&#xff1a;算法是模型分析的一组可行的&#xff0c;确定的&#xff0c;有穷的规则。基于规则的人工智能上个世纪六七十年代出现的早期人工智能系统都是基于…

VueJs中如何自定义hooks(组合式)函数

前言在Vue当中,一个非常重要的功能就是组件的复用,编写Vue组件,更多的也是在拼装组件,将页面的各个功能进行模块化便于维护和管理,而在项目里,有些页面中的组件的逻辑功能是一样的,如果没有进行功能逻辑的复用,那么每个页面都需要重复的写一遍在Vue当中各个组件是保持独立的,如…

一份职业游戏3D建模师日常工作流程列表,看完不信还有人说建模门槛低

随着游戏行业的发展&#xff0c;越来越多的人开始对这个行业感兴趣&#xff0c;因此有很多的小伙伴梦想成为一个游戏模型师&#xff0c;成为游戏行业里的一员。但是很多人都对这个工作具体是做什么的并不是很了解&#xff0c;下面&#xff0c;我们就来说说游戏模型师的主要工作…

Word处理控件Aspose.Words功能演示:使用 C# 将 DOCX 转换为 HTML

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

Javascript:Class构造函数

为什么需要class 在其他语言中class已经是一个早就被实现的功能&#xff0c;在JavaScript中一直到ES6被实现。在class没有实现之前我们是这样写的&#xff08;如下代码&#xff09; function Person(name,sex){this.name this.sex } Person.prototype.sayfunction(){alert(h…

金融类的APP该如何进行ASA推广

移动理财成为新金融的主流&#xff0c;在如今&#xff0c;金融机构都在争相推出自己的移动理财产品&#xff0c;那今天柚鸥ASO就来给大家讲一下&#xff0c;金融类的APP在进行ASA前的一些注意事项。 APP进行ASA前的开户有两种&#xff1a; 自主开户&#xff08;1&#xff0c;…

检测物理内存容量

文章目录前言前置知识BIOS 中断 0x15 子功能 0xe820 获取内存代码说明实验操作前言 本博客记录《操作系统真象还原》第五章实验操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a;三种检测内存的方法。 实验原理&#xff1a; …

volaile关键字详解!

文章目录什么是volatile &#xff1f;volatile三大特性volatile如何使用volatile保证可见性volatile不保证原子性volatile禁止指令重排volatile总结什么是volatile &#xff1f; volatile是一个Java关键字volatile是Java虚拟机提供的轻量级的同步机制 volatile三大特性 保证…

【服务器搭建个人网站】教程五:手把手教你怎样进行公安备案 快来学~

前言 购买一台服务器&#xff0c;再来个域名&#xff0c;搭建一个自己的个人博客网站&#xff0c;把一些教程、源码、想要分享的好玩的放到网站上&#xff0c;供小伙伴学习玩耍使用。我把这个过程记录下来&#xff0c;想要尝试的小伙伴&#xff0c;可以按照步骤&#xff0c;自己…

【Qt】将QtDesigner生成的.ui文件转化为.h头文件

【Qt】将QtDesigner生成的.ui文件转化为.h头文件1、背景2、实例3、附件1、背景 操作系统&#xff1a;windows10专业版。 Qt版本&#xff1a;qt-opensource-windows-x86-msvc2013_64-5.7.1.exe 博主的Qt安装目录&#xff1a;E:\E01_cppIDE\E01_qt\install 并将安装后的bin目录…

校园wifi网页认证登录入口

一、校园WIFI自助服务简介在我校校园网认证业务中&#xff0c;教职工校园通行证账号支持最大3个终端同时在线&#xff0c;如果超出最大在线数&#xff0c;最后上线的终端会把第一个上线的终端踢下线&#xff0c;导致终端经常掉线&#xff0c;需要重新登录才可上网。那么&#x…

【Linux】基础:基础IO

【Linux】基础&#xff1a;基础IO 摘要&#xff1a;本文基础IO的内容将从过往熟悉的C语言文件操作出发&#xff0c;引申指系统调用的文件操作&#xff0c;再进一步深化为对于进程管理的文件进行介绍&#xff0c;从而了解文件描述符的概念和管理方式&#xff0c;其中还会介绍其运…

2022 IoTDB Summit:京东刘刚《Apache IoTDB 在京东万物互联场景中的应用》

12 月 3 日、4日&#xff0c;2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本&#xff0c;并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例&#xff0c;深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

基于JavaSpringMvc+mybatis实现学生信息管理系统

基于JavaSpringMvcmybatis实现学生信息管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

IOS Theos Tweak 之 HelloWorld

一、目标 Theos是什么&#xff1f; 是一套跨平台的开发工具套件,不仅可以开发Ios&#xff0c;Mac、Windows和Linux也可以的哦&#xff0c;开源免费。 Tweak是什么&#xff1f; 可以理解成动态链接库&#xff0c;有搞过Windows下dll注入的同学应该可以秒懂了。Android的同学…

JavaWeb——redis_1/6

链接: day23_redis_代码&资料 提取码&#xff1a;ijyg 今日内容redis——数据库软件1. 概念2. 下载安装3. 命令操作1. redis的数据结构2. 字符串类型 string3. 哈希类型 hash4. 列表类型 list:可以添加一个元素到列表的头部&#xff08;左边&#xff09;或者尾部&#xff0…

硬件工程师成长之路(0)----认识元件

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言1、电阻①、贴片电阻②、金属膜电阻③、水泥电阻④、制动电阻⑤、电位器⑥、压敏电阻⑦、热敏电阻⑧、光敏电阻⑨、…

奇舞周刊478期:算法工程师深度解构 ChatGPT 技术

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■算法工程师深度解构 ChatGPT 技术本文用专业视野带你由浅入深了解 ChatGPT 技术全貌。它经历了什么训练过程&#xff1f;成功关键技术是什么&#xff1f;将如何带动行业的变革&#xf…

Spark学习(8)-SparkSQL的运行流程,Spark On Hive

1. SparkSQL的运行流程 1.1 SparkRDD的执行流程回顾 1.2 SparkSQL的自动优化 RDD的运行会完全按照开发者的代码执行&#xff0c; 如果开发者水平有限&#xff0c;RDD的执行效率也会受到影响。而SparkSQL会对写完的代码&#xff0c;执行“自动优化”&#xff0c; 以提升代码运…