Linux常用命令1

查看硬盘使用情况  df -hl
查看目录使用情况  du -h
查看占用的端口  netstat -ntlp
查看当前目录占用大小:du -sh --max-depth=0 
重命名命令: alias lm='ls -al' #将ls -al 命令重命名为lm,就可以直接使用了,使用alias可以查看当前已经重命名的命令
设置变量 name=VARaa #等号左右不能有空格 
删除变量 unset 变量名( unset name)
查看当前环境变量设置情况: env

问号变量的作用

『上一个执行的指令所回传的值』
0 表示该指令执行正常 其他表示错误

$?变量只能查看上一条命令的执行结果。

root@SC-201805061314:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
#可以看到返回 0 说明上一条指令执行没有错误
root@SC-201805061314:~# echo $?
0
#当前位置输出的127号,表示上条命令有错误
12dasd=qqq
12dasd=qqq: command not found
root@SC-201805061314:~# echo $?
127

查看历史命令(history)

alias h='history' # 将该命令重命名为 h
h 10 # 显示最近10条
h -c #将当前shell中的历史命令全部请吃
h -a #将目前新增的命令添加至 histfiles文件中 默认该文件的位置在~/.bash_history
echo $HISTSIZE 查看history中可以存储的命令条数

历史命令仅限于查看历史执行的命令吗?当然不是
!66  #执行第66条历史命令
!!   #执行上一条命令(相当于 按下 ↑ + enter)
!al  #执行历史命令中最近的以 al 开头的命令

在用户登录系统后显示一些提示信息

vim /etc/motd #在该文件写入的内容会在所有用户登录时,进行展示!

读取用户输入的 [read]

要读取来自键盘输入的变量,就是用 read 这个指令了。这个指令最常被用在 shell script 的撰写当中,
想要跟使用者对谈?用这个指令就对了。

[root@www ~]# read [-pt] variable
选项与参数:
-p :后面可以接提示字符!
-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量
[root@www ~]# read atest
This is a test <==此时光标会等待你输入!请输入左侧文字看看
[root@www ~]# echo $atest
This is a test <==你刚刚输入的数据已经变成一个变量内容!
范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named
的变量内容
[root@www ~]# read -p "Please keyin your name: " -t 30 named
Please keyin your name: VBird Tsai <==注意看,会有提示字符喔!
[root@www ~]# echo $named
VBird Tsai <==输入的数据又变成一个变量的内容了!

将脚本添加到~/bin目录中,可以直接执行

mkdir ~/bin
因为在系统启动后,会首先加载etcprofile(全局配置文件)文件,profile文件中加载了
~/.bash_profile(个人配置文件),而在~/.bash_profile这个人文件中将 ~/bin 这个目录写入了全局环境变量,
所以可以直接引用该目录下的所有可执行文件,而不需要写相对或绝对路径

数据流重定向

使用 > 表示覆盖重定向,会将文件中的历史数据覆盖。使用>>会追加到该文件中,不会覆盖.

现在有如下需求
登录普通用户,向要在 /home下查找 是否存在 .bashrc的文件,
find /home -name .bashrc 由于使用普通用户登录执行该命令,但在/home中还有其他用户家目录,是不允许访问的,所以会出现错误。
那么如果将正确的结果输入到一个文件,将报错信息出入到一个文件。

1> :以覆盖的方式将正确的数据输出到指定文件或设备上。
1>> :以追加的方式将正确的数据输出到指定文件或设备上。
2> :以覆盖的方式将错误的数据输出到指定文件或设备上。
2>> :以追加的方式将错误的数据输出到指定文件或设备上。

find /home -name .bashrc > list_right 2> list_error

这样 正确的信息会输出到 list_right 文件中
     错误信息会输出到 list_error 文件中

/dev/null 垃圾桶黑洞设备

想象一下,如果我们知道错误信息会发生,所以要将错误信息忽略掉而不显示或不存储 这个时候 /dev/null 就很重要了。这个/dev/null 可以吃掉任何导向这个设备的信息。

# 下面的命令将错误信息丢弃,正确信息写到屏幕上
find /home -name .bashrc 2> /dev/null

通过cat命令向文件输入内容

cat > catfile #这里可以通过cat命令向文件中输入内容 在输入结束后按 ctrl+c结束输入。

#使用 cat命令 将其它文件内容输入到 catfile 中
 cat > catfile < ./ssr.sh #将ssr.sh文件中的内容输出到catfile中

# 使用 << 结束 cat 输入
#例如,我要用cat直接将输入的信息输出到catfile,且当键盘输入 eof时,该次输入结束。

[root@iz2zedroc0yv90u3zvx212z ~]# cat > catfile << "eof"
dasdasds
dsadasdas
hahahaha
asdasdasd
eof

连续执行命令

通常我们在执行命令时,想一行执行多个命令,有什么办法可以呢?

# 一次执行多个命令,且命令时顺序执行的 
例:在关机之前先执行两次 sync 同步
sync; sync; shutdown -h now

#当两个命令存在相依性的时候,$$ 与 || 就派上用场了。
$$,|| 都是根据前一个命令的回传码进而决定后续命令是否执行
#回传码是一个命令在执行之后,会回传一个状态码用于表示该命令是否执行成功 可使用 echo $?查看回传码,一般 回传码为0表示命令执行正确
命令执行情况 说明
cmd1 && cmd2 若cmd1执行完毕且正确($?=0),则开始执行 cod2 若cmd1执行完毕且执行错误($?≠0),则cmd2不执行
cmd1 || cmd2 若cmd1执行完毕且正确($?=0),则不执行 cod2 若cmd1执行完毕且执行错误($?≠0),则cmd2开始执行
-------------------------------------------------------------
#使用ls查看/etc/qqq目录是否存在,不存在则不创建 aaa.txt文件,存在则创建。
ls /etc/qqq && touch aaa.txt
------------------------------------------------------------
#测试 /etc/qqq目录是否存在,不存在则创建,存在则不做事
ls /etc/qqq || mkdir /etc/qqq
-------------------------------------------------------------
#如果想创建/tmp/abc/hehe.txt 这个文件,但我们并不知道该目录是否存在,应该怎操作?
ls /tmp/abc/ || mkdir /tmp/abc && touch /tmp/abc/haha.txt

【分析】
这样无论如何hehe.txt这个文件都会被创建,为什么呢?
因为linux中命令总是从左向右执行,所以
 - 若/tmp/abc 不存在,则$?≠0,因为 || 遇到了错误所以开始执行 mkdir /tmp/abc 由于该命令会执行成功,所以$=0,又因为&&遇到了成功所以开始执行touch /tmp/abc/haha.txt,最终文件创建
 
 - 若/tmp/abc 存在,则$?=0,因为 || 遇到正确所以后面的mkdir /tmp/abc不会执行,此时,将$?=0继续向后传递,所以 $$ 遇到成功则会执行 touch /tmp/abc/haha.txt 最终文件创建
 -----------------------------------------------------------
 #测试 /tmp/vbirding 是否存在,若存在则输出 exist 不存在输出 not exist
 
 ls /tmp/vbirding && echo 'exist' || echo 'not exist'
ls: cannot access /tmp/vbirding: No such file or directory
not exist

管道

管道命令使用 | 符号,管道命令与“连续执行命令”是不同的。

在管道后面必须是一个能够接受 standard input的数据才行,这样的名称才称为管道命令,例如 less,more,head,tail等,至于 ls,cp,mv就不是管道命令了。

  • 主要事项
  • 管道命令只会处理 standard output,对于 standard error output会忽略
  • 管道命令必须奥能够接受来自前一个命令的数据为 standard input才能继续处理。

cut命令

这个命令可以将一段信息某段“切出”,处理的信息是以行为单位的

cut 主要是用于在一行中取出我们想要的部分信息

用法:
 cut -d'分割符' -f '字段'   #用于分割字符
 cut -c '字符范围' #用于排列整齐的信息
 
 #将PATH变量取出,找到第五个路径
 [root@iz2zedroc0yv90u3zvx212z tmp]# echo $PATH
/export/servers/jdk1.8.0_141/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/alidata/server/mysql/bin:/alidata/server/nginx/sbin:/alidata/server/php/sbin:/alidata/server/php/bin:/root/bin

[root@iz2zedroc0yv90u3zvx212z tmp]# echo $PATH |cut -d ':' -f 5
/usr/bin

#取出第三个和第五个
echo $PATH |cut -d ':' -f 3,5

#将 export 输出的信息取得第12个字符以后的所有字符串
[root@iz2zedroc0yv90u3zvx212z tmp]# export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="iz2zedroc0yv90u3zvx212z"
declare -x JAVA_HOME="/export/servers/jdk1.8.0_141"
declare -x LANG="en_US.UTF-8"
。。。

[root@iz2zedroc0yv90u3zvx212z tmp]# export | cut -c 12-
HISTCONTROL="ignoredups"
HISTSIZE="1000"
HOME="/root"
HOSTNAME="iz2zedroc0yv90u3zvx212z"
JAVA_HOME="/export/servers/jdk1.8.0_141"
LANG="en_US.UTF-8"
。。。
#也可以指定范围 
export | cut -c 12-20

grep

grep 是分析一行信息,若当中有我们需要的信息就将该行拿出来

语法
 grep [-acinv] [--color=auto] '查找字符串' filename
 -a 将binary文件以text文件的方式查找数据
 -c 计算找到 ‘查找字符串’ 的次数
 -i 忽略大小写,大小写视为相同
 -n 输出行号
 -v 反向选择,即显示没有 '查找字符串'内容的行
 --color=auto 可以将显示的字符串按指定颜色显示
 
 # last 当中有出现 root的就取出
 last |grep 'root'
 
 #last 中没没有出现root的显示
 last |grep -v 'root'
  • 高级用法

搜索字符串 加行号

grep -n 'the' regular_express.txt

反向选择

比如如下命令,当该行没有 'the' 这个字符串时才显示在屏幕上

 grep -vn 'the' regular_express.txt

忽略大小写

grep -in 'the' regular_express.txt

使用[]搜索

#表示搜索包含 tast test 的行,[]中无论都几个字符,都只代表一个
即 t?st
 grep -n t[ae]st regular_express.txt

搜寻 包含oo 的行

[root@www ~]# grep -n 'oo' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!

搜寻 在 oo 前面不包含g的行

[root@www ~]# grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
# 第2,3行没有异议,18 行虽然有不符合条件的,但是后面有too是符合条件的,所以是符合的

搜寻 oo前没有小写字母的

grep -n '[^a-z]oo' regular_express.txt
#也可以这样操作
[root@www ~]# grep -n '[^[:lower:]]oo' regular_express.txt
# 那个 [:lower:] 代表的就是 a-z 的意思。

行首与行尾字符 ^ $

我们在例题一当中,可以查询到一行字符串里面有 the 的,那如果我想要让 the 只在行首列出呢? 这
个时候就得要使用制表符了!我们可以这样做:

[root@www ~]# grep -n '^the' regular_express.txt
12:the symbol '*' is represented as start.

#开头是小写字符
grep -n '^[a-z]' regular_express.txt

#不想要开头是英文字母
grep -n '^[^a-zA-Z]' regular_express.txt

注意到了吧?那个 ^ 符号,在字符集合符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,
在 [] 之外则代表定位在行首的意义!

行尾
#找出行尾是小数点结束的 
#因为小数点具有其他意义,所以必须要使用跳脱字符()来加以解除其特殊意
义!
grep -n '.$' regular_express.txt

#如果我想要找出来,哪一行是『空白行』, 也就是说,该行并没有
#输入任何数据,该如何搜寻?
grep -n '^$' regular_express.txt
#因为只有行首跟行尾 (^$),所以,这样就可以找出空白行

去掉空白行与注释(#号开头的行)
grep -v '^$' /etc/syslog.conf | grep -v '^#'
# 其中第一个『 -v '^$' 』代表『不要空白行』,
# 第二个『 -v '^#' 』代表『不要开头是 # 的那行』喔!

通配

. (小数点):代表『一定有一个任意字符』的意思;

  • (星星号):代表『重复前一个 0 到无穷多次』的意思,为组合形态
#假设我需要找出 g??d 的字符串,亦即共有四个字符, 起头是 g
而结束是 d ,我可以这样做

grep -n 'g..d' regular_express.txt


#如果我需要找出【至少2个o以上的字符串】就需要ooo*了,因为*表示前面的一个可以有0个或多个o
 grep -n 'ooo*' regular_express.txt
 
 我想要字符串开头与结尾都是 g,但是两个 g 之间
仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等,那该如何?
 grep -n 'goo*g' regular_express.txt
 
 如果我想要找出 g 开头与 g 结尾的字符串,当中的字符可有可无,那该如何
是好?

grep -n 'g.*g' regular_express.txt
#说明:.代表任意 *代表0或多个 所以中间就是任意字符的任意个

如果我想要找出『任意数字』的行列呢?因为仅有数字,所以就成为
grep -n '[0-9][0-9]*' regular_express.txt
范围限定{}

如果我想要限制
一个范围区间内的重复字符数呢?举例来说,我想要找出两个到五个 o 的连续字符串,该如何作?这时
候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须
要使用跳脱字符 来让他失去特殊意义才行。

#假设我要找到两个 o 的字符串,可以是:
grep -n 'o{2}' regular_express.txt

#假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字符串,他会是这样
grep -n 'go{2,5}g' regular_express.txt

#如果我想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:

grep -n 'go{2,}g' regular_express.txt

*注意:『正规表示法的特殊字符』与一般在指令列输入指令的『通配符』并不相同, 例如,在通配
符当中的 * 代表的是『 0 ~ 无限多个字符』的意思,但是在正规表示法当中, * 则是『重复 0 到无穷
多个的前一个 RE 字符』的意思~使用的意义并不相同,不要搞混了!
举例来说,不支持正规表示法的 ls 这个工具中,若我们使用 『ls -l * 』 代表的是任意档名的档案,而
『ls -l a
』代表的是以 a 为开头的任何档名的档案, 但在正规表示法中,我们要找到含有以 a 为开头
的档案,则必须要这样:(需搭配支持正规表示法的工具)
ls | grep -n '^a.*' **

例题
找出 /etc 下的连接类型文件
ls -l |grep '^l'

找出 /etc 下非连接文件(链接文件以 l开头)
ls -l |grep '^[^l]'
# 说明 ^在[]外边表示字符串开头,在[]里面表示 非

找出 /etc 下链接类型文件的总数
ls -l /etc/ | grep '^l' | wc -l

sed 工具

sed 本身也是一个管线命令,可以分析 standard input 的啦! 而且 sed
还可以将数据进行取代、删除、新增、撷取特定行等等的功能

[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN
 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过
 sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在指令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内
的
 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语
法)
-i :直接修改读取的档案内容,而不是由屏幕输出。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我
的动作
 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚:
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下
一行)~
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一
行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配
 正规表示法!例如 1,20s/old/new/g 就是啦!
  • 实例
# 将 /etc/passwd 的内容列出并且打印行号,同时,请将第 2~5 行删除!
nl /etc/passwd | sed '2,5d'

注意的是,
sed 后面接的动作,请务必以 '' 两个单引号括住

# 只要删除第 2 行
nl /etc/passwd | sed '2d'

# 若是要删除第 3 到最后一行
nl /etc/passwd | sed '3,$d'  #『 $ 』代表最后一行!

# 在第二行后(亦即是加在第三行)加上『drink tea』字样!
 nl /etc/passwd | sed '2a drink tea'
 
 #在第二行前面加上『drink tea』字样!
 nl /etc/passwd |sed '2i Drink tea'
 
 # 如果是要增将两行以上呢?
 [root@iz2zedroc0yv90u3zvx212z ~]# nl /etc/passwd |sed '2a Drink tea or ...
> drink beer?'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ...
drink beer?
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
# 第一后面必须加  单引号不要闭合

#插入4行
nl /etc/passwd |sed '2a aaa
> bbb
> cccc
> ddd'

  • 取代操作

c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!

将第 2-5 行的内容取代成为『No 2-5 number』呢?
 nl /etc/passwd |sed '2,5c No 2-5 number'
 
 仅列出 /etc/passwd 档案内的第 5-7 行
 nl /etc/passwd | sed -n '5,7p'
 #sed 后面需要加-n 不加-n会重复5-7行数据,达不到预期
  • 部分数据的搜寻并取代的功能

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代的功能喔! 基本上 sed
的搜寻与取代的与 vi 相当的类似!

sed 's/要被取代的字符串/新的字符串/g'

ip截取

/sbin/ifconfig eth0 |grep 'inet'|sed 's/^.*inet //g' |sed 's/net.*$//g'

#说明 grep 'inet' 先过滤出ip地址行
inet 192.168.1.221  netmask 255.255.255.0  broadcast 192.168.1.255
通过  sed 's/^.*inet //g'  配合正则表达式,去掉 ip前面的字符/ / /字符串替换

通过sed 's/net.*$//g' 去掉ip后面的字符
找到 带 MAN的行 去除注释行 去除空行
cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | 
> sed '/^$/d'
.结尾的换为!
 sed -i 's/.$/!/g' regular_express.txt
 # 上头的 -i 选项可以让你的 sed 直接去修改后面接的档案内容而不是由屏幕输出
喔!
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a
test』
sed -i '$a # This is a test' regular_express.txt
# 由于 $ 代表的是最后一行,而 a 的动作是新增,因此该档案最后新增啰!

PAGE 434

awk:好用的数据处理工具

awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一
行当中分成数个『字段』来处理。因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运作的
模式是这样的:

awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename

awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作。

在awk中每一个字段有一个固定变量表示 $1表示第一个字段 $2表示第二个字段依此类推.其中$0表示一整行

  • awk的处理流程
1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
3. 做完所有的动作与条件类型;
4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

实例

若我想要取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开,则会变成这样:

 last -n 5 | awk '{print $1 "	" $3}'
  • 内建变量
变量名称 代表意义
NF 每一行 ($0) 拥有的字段总数
NR 目前 awk 所处理的是『第几行』数据
FS 目前的分隔字符,默认是空格键
  • 实例2
我们继续以上面 last -n 5 的例子来做说明,如果我想要:
x 列出每一行的账号(就是 $1);
x 列出目前处理的行数(就是 awk 内的 NR 变量)
x 并且说明,该行有多少字段(就是 awk 内的 NF 变量)

 last -n 5| awk '{print $1 "	 lines: " NR "	 columes: " NF}'
 # 说明 NR NF等内建变量不需要前面加$, 要写在字符串外部。

-实例3

举例来说,在 /etc/passwd 当中是以冒号 ":" 来作为字段的分
隔, 该档案中第一字段为账号,第三字段则是 UID。那假设我要查阅,第三栏小于 10 以下的数据,并
且仅列出账号与第三栏, 那么可以这样做:

cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "	" $3}'

结果
root:x:0:0:root:/root:/bin/bash
bin     1
daemon  2
adm     3
lp      4
sync    5
shutdown        6
halt    7
mail    8
发现 除第一行有问题,其余的都改变了,为什么第一行没有变呢?
这是因为我们读入第一行的时候,那些变数 $1,
$2... 默认还是以空格键为分隔的,所以虽然我们定义了 FS=":" 了, 但是却仅能在第二行后才开始生效。

# 那应该如何操作 可以使用 BEGIN
 cat /etc/passwd |awk 'BEGIN{FS=":"} $3 < 10 {print $1 "	" $3}'
注意:BEGIN 要在{}外面哦!

awk的计算功能

如果要用 awk 来进行『计算功能』呢?以
底下的例子来看, 假设我有一个薪资数据表档名为 pay.txt ,内容是这样的:

Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 20000 23000
Bird2 43000 42000 41000

如何帮我计算每个人的总额呢?而且我还想要格式化输出喔!我们可以这样考虑:

  • 第一行只是说明,所以第一行不要进行加总 (NR==1 时处理);
  • 第二行以后就会有加总的情况出现 (NR>=2 以后处理)
 cat pay.txt|
> awk 'NR==1 {printf "%10s %10s %10s %10s
",$1,$2,$3,$4,"Total"}
> NR>=2{total = $2 + $3 + $4
> printf "%10s %10d %10d %10d %10.2f
",$1,$2,$3,$4,total}'

也可以是:
cat pay.txt|awk 'NR==1 {printf "%10s %10s %10s %10s
",$1,$2,$3,$4,"Total"}NR>=2{total = $2 + $3 + $4;printf "%10s %10d %10d %10d %10.2f
",$1,$2,$3,$4,total}'

以上两个不同之处在与在一个{}中若有多个语句,则需要用回车或者分号(;)隔开

注意:
逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
格式化输出时,在 printf 的格式设定当中,务必加上 ,才能进行分行!
bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。

排序命令

sort

sort [-fbMnrtuk] [file or stdin]
参数
-f 忽略大小写
-b 忽略最前面的空格
-M 以月份名字来排序,例如 JAN,DEC等排序方法
-n 使用“纯数字”进行排序(默认字典排序)
-r 反向排序
-u 就是uniq 相同的数据只出现一次,去重
-t 分隔符 ,默认[Tab]
-k 以哪个区间进行排序

#个人账号记录在 /etc/passwd 文件中,对个人账号进行排序
cat /etc/passwd |sort

# passwd内容是以 :进行分割的,向以第三列来排序,如何操作?
cat /etc/passwd |sort -t ':' -k 3
看到数字也是按照字典排序的,想用数字排序需要加 -n
 cat /etc/passwd |sort -t ':' -k 3 -n
 
# 利用last只输出账号数据,并排序
last |cut -d ' ' -f1 | sort

uniq

去重

uniq [-ic]
-i 忽略大小写
-c 进行计数

#使用last 将账号列出,仅取账号列,进行排序并去重
last |cut -d ' ' -f1 | sort | uniq

#如果还想知道登录次数,怎么操作?
[root@iz2zedroc0yv90u3zvx212z etc]# last |cut -d ' ' -f1 |sort | uniq -c
      1
      2 reboot
     66 root
      1 wtmp

wc

如果想知道 /etc/man.config 这个文件里有多少字?多少行?多少字符的话,就可以使用wc完成

wc [-lwm]
-l 仅列出行
-w 仅列出字(单词)
-m 多少字符

#查看 /etc/profile 中有多少 字,行,字符数
[root@iz2zedroc0yv90u3zvx212z etc]# cat /etc/profile |wc
     89     271    2199
# 输出的三个数字分别代表 行,字数,字符数

#列出这个月份登陆系统的总人次
last |grep [a-zA-Z] |grep -v 'wtmp' |wc -l
#说明:由于last 中会显示空白行 ,所有使用 grep [a-zA-Z]去掉空白行,使用 grep -v 'wtmp' 去掉 wtmp 最后统计行数即可

双向重定向 tee

tee 命令可以将数据输出到文件 并 在命令行显示

将ls的数据在homefile中存储并在屏幕打印数据

ls -l /home |tee ~/homefile |more

kettle 执行转换任务的脚本命令

 ./pan.sh -file ../kettle/json2txt.ktr -param:input=/export/servers/kettle/ -param:output=/export/servers/kettle/

file ../kettle/json2txt.ktr   指定脚本名称
-param:input=/export/servers/kettle/    指定输入路径
-param:output=/export/servers/kettle/   指定输出路径

kettle执行作业任务的脚本命令

../data-integration/kitchen.sh -file 服务器作业.kjb -param:input=/export/servers/kettle/  -param:output=/export/servers/kettle/
原文地址:https://www.cnblogs.com/maguangyi/p/14215189.html