Linux中bash


1 查看可以使用的shell

cat /etc/shells

系统默认使用的是bash,有几个好处:
1. 命令记忆功能(history)
2. 自动补全
3. 别名设置:alias
4. 通配符

2 查看命令是内置还是外部

type 命令名称(eg.ls

3 shell变量

3.1 变量的显示:

echo $name

3.2 变量的设置

例如设置变量myname的值为jack:

myname=jack

3.3 变量取消

unset myname

案例:对经常要使用的长目录名称设置成变量,可以方便操作。例如

[root@h2 ~]# work=/root/emotion/springboot-beatlsql/target
[root@h2 ~]# cd $work

3.4 环境变量

可以使用envexport查看环境变量,可以使用set查看所有变量(包括自定义变量)。
注意:
- $本身也是变量,代表的是目前Shell的线程代号,即PID。
- ?也是特殊的变量,它是上一个执行的命令所传回的值。

3.5 自定义变量转环境变量

可以使用export
案例:子进程只能使用父进程的环境变量,如果要使用父进程的自定义变量,在父进程中要将自定义的变量转成环境变量。

[root@h2 target]# work=/root/emotion/springboot-beatlsql/target
[root@h2 target]# echo $work #父进程
/root/emotion/springboot-beatlsql/target
[root@h2 target]# bash #进入子进程
[root@h2 target]# echo $work #没有显示,因为子进程不能获取父进程自定义的变量

[root@h2 target]# exit #退出子进程
exit
[root@h2 target]# export work #将父进程的work变量转成环境变量
[root@h2 target]# bash #进入子进程
[root@h2 target]# echo $work #子进程能获取环境变量
/root/emotion/springboot-beatlsql/target

3.6 变量从键盘读取

  1. read:读取来自键盘的变量,语法:
read [-pt] 变量名   
-p:接提示符    
-t: 等待秒数(必须在等待秒数内输入,不会一直等待用户)

例如:

[root@h2 target]# read -p 请输入您的名字:  yn
请输入您的名字:mike
[root@h2 target]# echo $yn
mike
  1. declare/typeset:声明变量类型,语法:
declare [-aixr] 变量名
-a:将变量定义为数组
-i:将变量定义为整型数字
-x:用法跟export一样,将变量带出为环境变量
-r:将变量设置为只读类型,该变量不可以修改内容,也不可以重设

例如:

[root@h2 ~]# declare sum=10+2+3 #默认变量的类型为字符串
[root@h2 ~]# echo $sum
10+2+3
[root@h2 ~]# declare -i sum=10+2+3 #声明sum为整型数字
[root@h2 ~]# echo $sum
15
  1. array变量类型,语法:

var[idex]=内容

例如:

[root@h2 ~]# var[1]=aa
[root@h2 ~]# var[2]=bb
[root@h2 ~]# var[3]=cc
[root@h2 ~]# echo ${var[1]},${var[2]},${var[3]}
aa,bb,cc

3.7 限制用户资源:ulimit

ulimit [-SHacdfltu] [配额]
-a:后面不接任何参数,可以列出所有的限制额度
-f:此shell可以创建的最大文件的容量

3.7 变量内容的删除、替代和替换

1.从前向后删除,用#,删除的内容介于/到:之间(任意匹配字符都可以)

[root@h2 ~]# path=$PATH
[root@h2 ~]# echo $path
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin
[root@h2 ~]# echo ${path#/*hbase/bin:} #删除开始到"hbase/bin:"的内容
/root/apps/apache-maven-3.5.2/bin:/root/bin

注意:
- #代表符合替换文字的最短的那一个
- ##代表符合替换文字的最长的那一个

[root@h2 ~]# echo ${path#/*:}  #1
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin
[root@h2 ~]# echo ${path##/*:} #2
/root/bin
[root@h2 ~]#

其中,1处的结果其实就是:
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin
2处的结果其实就是:
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin

2.从后向前删除,用%,

[root@h2 ~]# echo ${path%/apache-maven*bin}
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps

3.替换:”/旧字符串/新字符串”或”//旧字符串/新字符串”
例如:将第一个usr替换成USR

[root@h2 ~]# echo ${path/usr/USR}
/USR/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin

将所有usr替换成USR

[root@h2 ~]# echo ${path//usr/USR}
/USR/local/tomcat/bin:/USR/local/sbin:/USR/local/bin:/sbin:/bin:/USR/sbin:/USR/bin:/USR/lib/jvm/jdk1.8.0_151/bin:/USR/lib/jvm/jdk1.8.0_151/jre/bin:/USR/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin

4 命令别名与历史命令

4.1 命令别名设置:alias,unalias

  1. 查看目前有哪些命令别名:
[root@h2 ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

2.设置命令别名,格式:

alias 别名=命令

例如,

[root@h2 ~]# alias get='ps -ef | grep spring'
[root@h2 ~]# get
root     20504     1  0 Nov22 ?        00:01:22 java -jar springboot-beatlsql-0.0.1-SNAPSHOT.jar
root     31719 31660  0 18:56 pts/1    00:00:00 grep spring
[root@h2 ~]# alias
alias cp='cp -i'
alias get='ps -ef | grep spring'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

3.取消命令别名,格式:

unalias 命令别名

例如,取消get命令别名

[root@h2 ~]# unalias get
[root@h2 ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@h2 ~]# 

4.2 历史命令:history

1.存储位置:~/.bash_history。
2.可以通过echo $HISTSIZE查看纪录的总条数,默认1000(在/etc/profile里面配置的)。
假设\~/.bash_history已结纪录了0-1000条数据,登录主机后,执行了100条数据,那么,系统会将101~1100这1000条纪录新到\~/.bash_history中。所以,\~/.bash_history永远只会存储最近的1000条纪录数据。
3.格式:

history [n]
history [-c]
history [-raw] histfiles
n:数字,列出最近的n条命令行
-c:将目前shell中的所有history内容全部清除
-r:将histfiles的内容存储到当前shell的history中
-a:将目前新增的history命令新增入histfiles中,若没有加histfiles,则默认写入~/.bash_history
-w:将目前的hostory记忆内容写入histfiles中

4.执行history中的命令:

!命令编号 #执行history中第几条命令编号的意思
!字符串 #由最近的命令向前搜索hostory中以该字符串开头的命令,并执行

例如

[root@h2 ~]# history
 省略...
  981  netstat -anp|grep :80
  982  cd ..
  983  pa -ef |grep spring
  984  ps -ef |grep spring
  985  kill -9 17089
  986  cd ..
[root@h2 ~]# !981
netstat -anp|grep :80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      20504/java          
省略...
[root@h2 ~]# !ps
ps -ef|grep spring
root     20504     1  0 Nov22 ?        00:01:23 java -jar springboot-beatlsql-0.0.1-SNAPSHOT.jar
root     31945 31660  0 19:25 pts/1    00:00:00 grep spring

5 Bash Shell的操作环境

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

1.非远程登录的界面信息在:/etc/issue
远程登录的界面信息在:/etc/issue.net
2.若想让所有用户登录后取得一些信息,可以在/etc/motd里添加这些信息。
例如,添加信息后登录:

Welcome to aliyun Elastic Compute Service!

本机将在晚间0:00到6:00进行系统维护,请不要在此期间登录,谢谢
[root@h2 ~]#

5.2 bash的环境配置文件

  1. login shell:需要账号密码登录,
    non-login shell:例如命令登录后再以图形界面启动时。
  2. bash的在login shell情况下,
    (1)读取的整体环境配置文件是/etc/profile,但是/etc/profile还会调用其他的配置文件。
    (2)\~/.bash_profile或\~/.bash_login或~/.profile属于个人设置。其实bash的login shell设置只会读取上面三个文件的其中一个,而读取的顺序则是上面的顺序。
    本主机有\~/.bash_profile文件,它会调用~/.bashrc的内容。
[root@h2 ~]# 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
  1. bash的在non-login shell情况下,
    只会读取~/.bashrc的内容而已。Centos 5.x还会主动调用/etc/bashrc文件内容。
  2. source:读入环境配置文件的命令。

5.3 终端机的环境设置:stty,set

使用下面命令列出所有的按键与按键内容

stty -a

不建议修改

6 数据流重定向

数据流重定向:将某个命令执行后应该出现在屏幕上的数据传输到其他的地方,例如文件或设备(打印机)。

6.1 标准输出(stdout):>或>>

例如,将/下各目录的文件名,权限和属性记录到~/rootfile文件中:

[root@h2 ~]# ll / > ~/rootfile
[root@h2 ~]# cat rootfile 
total 108
drwxr-xr-x   6 root root  4096 Nov  8 19:32 apps
dr-xr-xr-x.  2 root root  4096 Nov  6 15:05 bin
dr-xr-xr-x.  4 root root  4096 Aug 14  2014 boot
drwxr-xr-x  10 root root  4096 Nov  6 15:06 cgroup
drwxr-xr-x  16 root root  3360 Jul 16 13:42 dev
drwxr-xr-x. 90 root root  4096 Nov 23 20:02 etc
drwxr-xr-x.  4 root root  4096 Jul 16 14:50 home
dr-xr-xr-x. 10 root root  4096 Sep 26 20:35 lib
dr-xr-xr-x.  9 root root 12288 Nov  6 15:05 lib64
drwx------.  2 root root 16384 Aug 14  2014 lost+found
drwxr-xr-x.  2 root root  4096 Sep 23  2011 media
drwxr-xr-x.  2 root root  4096 Sep 23  2011 mnt
drwxr-xr-x.  5 root root  4096 Nov  6 15:14 opt
dr-xr-xr-x  94 root root     0 Jul 16 21:41 proc
dr-xr-x---. 16 root root  4096 Nov 24 13:43 root
dr-xr-xr-x.  2 root root 12288 Nov  6 15:05 sbin
drwxr-xr-x.  2 root root  4096 Aug 14  2014 selinux
drwxr-xr-x.  2 root root  4096 Sep 23  2011 srv
drwxr-xr-x  13 root root     0 Jul 16 21:41 sys
drwxrwxrwt. 62 root root  4096 Nov 23 16:00 tmp
drwxr-xr-x. 14 root root  4096 Nov 20 20:28 usr
drwxr-xr-x. 23 root root  4096 Mar 21  2017 var
drwxr-xr-x   3 root root  4096 Oct 28  2015 yjdata

注意:
- 若该文件(上面是~/rootfile)不存在,系统则自动创建该文件;
- 若存在,那么使用>时系统会现将该文件内容清空,再写入数据;
- 若想追加而不想覆盖,可以使用>>。

6.2 标准错误输出(stderr):2>或2>>

标准错误输出:执行命令失败时返回的错误信息,例如读取某个不存在的文件时,屏幕上显示错误信息。

[root@h2 ~]# cat haha
cat: haha: No such file or directory

将错误信息记录到~/errfile文件中:

[root@h2 ~]# cat haha 2> errfile
[root@h2 ~]# cat errfile 
cat: haha: No such file or directory

同理,若想追加而不是覆盖,可以使用2>>。

/dev/null:垃圾桶黑洞

  在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现”Permissiondenied.”(禁止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入:

find / -name 文件 2>/dev/null

  这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。

例如:以下以非root用户登录

[hadoop@h2 ~]$ find /home -name .bashrc
find: `/home/jack': Permission denied #标准错误输出
/home/hadoop/.bashrc
find: `/home/hadoop/apps/hadoop-2.6.4/data/tmp/nm-local-dir/nmPrivate': Permission denied #标准错误输出
find: `/home/hadoop/apps/hadoop-2.6.4/data/tmp/dfs/data': Permission denied #标准错误输出
find: `/home/hadoop/apps/tomcat/lib': Permission denied #标准错误输出
find: `/home/hadoop/apps/tomcat/work': Permission denied #标准错误输出
find: `/home/hadoop/apps/tomcat/temp': Permission denied #标准错误输出
find: `/home/hadoop/apps/tomcat/conf': Permission denied #标准错误输出
find: `/home/hadoop/apps/tomcat/webapps': Permission denied #标准错误输出
find: `/home/hadoop/apps/tomcat/logs': Permission denied #标准错误输出
find: `/home/hadoop/apps/tomcat/bin': Permission denied #标准错误输出

将错误信息丢弃,屏幕上只显示正确的数据:

[hadoop@h2 ~]$ find /home -name .bashrc 2> /dev/null
/home/hadoop/.bashrc

可以将正确信息与错误信息分别写入文件

[hadoop@h2 ~]$ find /home -name .bashrc >right  2> /dev/null
[hadoop@h2 ~]$ cat right 
/home/hadoop/.bashrc

可以将正确信息和错误信息同时写入文件

[hadoop@h2 ~]$ find /home -name .bashrc >all  2> all  #错误!次序错乱!
[hadoop@h2 ~]$ find /home -name .bashrc >all  2>&1 #正确

6.3 标准输入(stdin):<和<<

标准输入:将原本需要由键盘输入的数据改为由文件内容来替代。

7 管道命令(pipe)

image

Command1正确输出,作为Command2的输入 然后Command2的输出作为,Command3的输入 ,Command3输出就会直接显示在屏幕上面了。

通过管道之后:Command1,Command2的正确输出不显示在屏幕上面

注意:

  • 管道命令只处理前一个命令正确输出,不处理错误输出。
  • 管道命令右边命令,必须能够接收标准输入流命令才行(less,more,head,tail,grep都可以,而ls,cp,mv不行)。

7.1 选取命令:cut,grep

选取命令:将一段数据经过分析后,取出我们想要的(一般以行来分析)。
1. cut:切分,处理信息是按照“行”为单位。格式:

cut -d '分割字符' -f '保留第几段'  #分割字符串
cut -c 字符范围   #用于排列整齐的信息

例如:以“:”分割,得到第3段

[root@h2 ~]# echo $CLASS_PATH
.:/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib
[root@h2 ~]# echo $CLASS_PATH |cut -d ':' -f 3 
/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar

以“:”分割,得到第2段和第4段

[root@h2 ~]# echo $CLASS_PATH |cut -d ':' -f 2,4
/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib

export后显示的数据排列整齐

[root@h2 ~]# export
declare -x CATALINA_BASE="/usr/local/tomcat"
declare -x CLASS_PATH=".:/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib"
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HADOOP_HOME="/home/hadoop/apps/hadoop-2.6.4"
declare -x HBASE_HOME="/home/hadoop/apps/hbase"
省略...

我们将export输出的信息取得第12字符以后的所有字符串
[root@h2 ~]# export | cut -c 12-

CATALINA_BASE="/usr/local/tomcat"
CLASS_PATH=".:/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib"
CVS_RSH="ssh"
G_BROKEN_FILENAMES="1"
HADOOP_HOME="/home/hadoop/apps/hadoop-2.6.4"
HBASE_HOME="/home/hadoop/apps/hbase"
HISTCONTROL="ignoredups"
HISTSIZE="1000"
HIVE_HOME="/home/hadoop/apps/hive"

也可以取得某个范围的数据,例如:

export | cut -c 12-20
CATALINA_
CLASS_PAT
CVS_RSH="
G_BROKEN_
HADOOP_HO
HBASE_HOM
省略...
  1. grep:分析一行信息,若有所需信息,就将这行拿出来
    格式:
grep [-acinv] [--color=auto] '要查找的字符串' 文件名
-a:将binary文件以text文件方式查找数据;
-c:计算找到'要查找的字符串'的次数;
-i:忽略大小写;
-n:输出行号;
-v:反向选择,即显示没有'要查找的字符串'的那一行;
--color=auto:找到的字符串加上颜色显示

例如:

[root@h2 ~]# last |grep -in  --color=auto  Hadoop #下面的hadoop其实是有颜色的
1:hadoop   pts/2        218.94.83.137    Fri Nov 24 13:53 - 14:20  (00:27)    
73:hadoop   pts/1        218.2.216.24     Sun Nov  5 16:46 - 16:46  (00:00)    
110:hadoop   pts/0        218.94.83.137    Sat Aug  5 11:37 - 11:37  (00:00)    
128:hadoop   pts/8        117.136.67.14    Fri Jul 21 13:45 - 13:46  (00:01)    
234:hadoop   pts/1        218.2.216.18     Thu Apr 20 21:30 - 22:07  (00:36)    
235:hadoop   pts/1        218.2.216.18     Thu Apr 20 20:04 - 20:18  (00:13)    
236:hadoop   pts/0        218.94.83.133    Thu Apr 20 17:22 - 21:54  (04:32)    
237:hadoop   pts/1        218.94.83.133    Thu Apr 20 17:16 - 17:21  (00:05)

7.2 排序命令:sort,uniq,wc

  1. sort
sort [-bcfMnrtk][文件]
-b   忽略每行前面开始出的空格字符。
-c   检查文件是否已经按照顺序排序。
-f   排序时,忽略大小写字母。
-M   将前面3个字母依照月份的缩写进行排序。
-n   依照数值的大小排序。
-o<输出文件>   将排序后的结果存入指定的文件。
-r   以相反的顺序来排序。
-t<分隔字符>   指定排序时所用的栏位分隔字符。
-k  选择以哪个区间进行排序。

例如:将/etc/passwd内容以:分隔,使用第三列来排序

[root@h2 ~]# cat /etc/passwd |sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
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
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
省略...

若要以数字排序,可以加上-n

[root@h2 ~]# cat /etc/passwd |sort -t ':' -k 3 -n
  1. uniq:将重复的数据仅列出一个显示,格式:
uniq [-ic]
-i:忽略大小写
-c:统计次数

例如:使用last将账户列出,仅取账户第一列,除去重复,统计次数

[root@h2 ~]# last |cut -d ' ' -f 1 |uniq -c
      1 hadoop
     71 root
      1 hadoop
     36 root
      1 hadoop
     16 root
      1 jack
      1 hadoop
      1 root
      1 jack
      省略...

使用last将账户列出,仅取账户第一列,进行排序后去除重复并统计次数

[root@h2 ~]# last |cut -d ' ' -f 1 |sort|uniq -c
      1 
      8 hadoop
     13 jack
     11 reboot
    271 root
      1 wtmp
  1. wc:统计文件(行,字数,字符数),格式:
wc [-lwm]
-l:仅列出行
-w:仅列出多少字(英文单字)
-m:多少字符

例如,统计/etc/man.config里面多少字、行、字符数

[root@h2 ~]# cat /etc/man.config |wc
    152     765    4940
    #输出的三个数字分别代表行、字数、字符数

统计目前有多少个账户( /etc/passwd中一行代表一个账户)

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

7.3 双向重定向:tee

tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
image
例如:我们将last的输出一份存到last.txt文件中,一份打印出来

[root@h2 ~]# last | tee last.txt
root     pts/2        218.94.83.137    Fri Nov 24 19:01   still logged in   
hadoop   pts/2        218.94.83.137    Fri Nov 24 13:53 - 14:20  (00:27)    
root     pts/1        218.94.83.137    Fri Nov 24 13:01   still logged in   
省略...
[root@h2 ~]# cat last.txt 
root     pts/2        218.94.83.137    Fri Nov 24 19:01   still logged in   
hadoop   pts/2        218.94.83.137    Fri Nov 24 13:53 - 14:20  (00:27)    
root     pts/1        218.94.83.137    Fri Nov 24 13:01   still logged in   
省略...

7.4 字符装换命令:tr,col,join,paste,expand

  1. tr:删除或压缩重复字符,格式:
tr [ds] 字符串
-d:删除字符串
-s:把连续重复的字符以单独一个字符表示

例如:将小写转大写

[root@h2 ~]# cat err
cat: 123: No such file or directory
[root@h2 ~]# cat err| tr '[a-z]' '[A-Z]'
CAT: 123: NO SUCH FILE OR DIRECTORY

使用tr删除字符:

[root@h2 ~]# echo "hello 123 world 456" | tr -d '0-9'
hello  world

用tr压缩字符,可以压缩输入中重复的字符:

[root@h2 ~]# echo "thissss is a text linnnnnnne." | tr -s ' sn'
this is a text line.
  1. col:过滤控制符
  2. join:看字面上的意义 (加入/参加) 就可以知道,他是在处理两个文件之间的数据, 而且,主要是在处理两个文件当中,有 “相同数据” 的那一行,才将他加在一起的意思。

 例如:用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏

[root@h2 ~]# 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$8TvfjgX7$EFjOxLuaxkc47x/JSaz6LSvxBtMay9Vji6NEynj2mVBuJhLt6F1wSuhWVBJQIVbJjBpjFS4gE1L.mk9.VDKq41:17361:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::

# 由输出的数据可以发现这两个文件的最左边字段都是账号!且以 : 分隔
[root@h2 ~]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$6$8TvfjgX7$EFjOxLuaxkc47x/JSaz6LSvxBtMay9Vji6NEynj2mVBuJhLt6F1wSuhWVBJQIVbJjBpjFS4gE1L.mk9.VDKq41:17361:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:15980:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:15980:0:99999:7:::
省略...
# 透过上面这个动作,我们可以将两个文件第一字段相同者整合成一行!
# 第二个文件的相同字段并不会显示(因为已经在第一行了嘛!)
  1. paste
    这个 paste 就要比 join 简单多了!相对于 join 必须要比对两个文件的数据相关性, paste 就直接『将两行贴在一起,且中间以 [tab] 键隔开』而已!简单的使用方法:
[root@h2 ~]# paste [-d] file1 file2
选项与参数:
-d  :后面可以接分隔字符。默认是以 [tab] 来分隔的!
-   :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。

范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起
[root@h2 ~]# paste /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:14126:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:14126:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin    adm:*:14126:0:99999:7:::
# 注意喔!同一行中间是以 [tab] 按键隔开的!
  1. expand
    这玩意儿就是在将 [tab] 按键转成空格键啦

7.5 切割命令:split

可以将大文件依据文件的大小或行数切割成小文件,格式:

[root@h2 ~]# split [-bl] file PREFIX
选项与参数:
-b  :后面可接欲分割成的文件大小,可加单位,例如 b, k, m 等;
-l  :以行数来进行分割。
PREFIX :代表前导符的意思,可作为分割文件的前导文字。
范例一:我的 /etc/termcap 有七百多K,若想要分成 300K 一个文件时?
[root@www ~]# cd /tmp; split -b 300k /etc/termcap termcap
[root@www tmp]# ll -k termcap*
-rw-r--r-- 1 root root 300 Feb  7 16:39 termcapaa
-rw-r--r-- 1 root root 300 Feb  7 16:39 termcapab
-rw-r--r-- 1 root root 189 Feb  7 16:39 termcapac
# 那个档名可以随意取的啦!我们只要写上前导文字,小文件就会以
# xxxaa, xxxab, xxxac 等方式来创建小文件的!

范例二:如何将上面的三个小文件合成一个文件,档名为 termcapback
[root@www tmp]# cat termcap* >> termcapback
# 很简单吧?就用数据流重导向就好啦!简单!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值