管道命令
概念
管道命令只会处理stdout,忽略stderr
管道命令后面接的第一个数据必定是命令,这个命令必须能够接收stdin
双向重定向
tee
用途:让stdout转存一份到文件内,并将同样的数据继续送到屏幕处理
tee [-a] file
a 不加a为>到file,加a为>>到file
[yc@yc temp]$ ls 1.txt [yc@yc temp]$ cat 1.txt aaaaa bbbbb ccccc [yc@yc temp]$ cat 1.txt | tee -a tee.log | grep b bbbbb [yc@yc temp]$ ls 1.txt tee.log [yc@yc temp]$ cat tee.log aaaaa bbbbb ccccc
关于减号-的用途
用来替代stdin 和stdout
[yc@yc temp]$ ls a b [yc@yc temp]$ ls a 1.txt 2.txt 3.txt [yc@yc temp]$ ls b [yc@yc temp]$ tar -cvf - a/ | tar -xvf - -C b/ a/ a/1.txt a/2.txt a/3.txt a/ a/1.txt a/2.txt a/3.txt [yc@yc temp]$ ls b/ a [yc@yc temp]$ ls b/a/ 1.txt 2.txt 3.txt
行的选取命令
grep
用途:分析一行信息,如果当中有我们需要的信息,就将该行拿出来
grep [-A] [-B] [-acEinv] [--color=auto] '查找字符串' filename
-A 后跟数字n,表after,除了该行,列出其后n行
-B 后跟数字n,表before,除了该行,列出其前n行
a 将binary文件以text文件的方式查找数据
c 计算找到'查找字符串'的次数
E 后跟扩展型正则表达式,一般用egrep代替,详见正则表达式
i 忽略大小写
n 输出行号
v 反向选择,即查找没有'查找字符串'的那一行
--color-auto 将找到的关键字颜色显示
# 查找特定字符串+显示行号 grep –n ‘the’ regular_express.txt # 查找非特定字符串+不区分大小写 ps aux | grep -i tomcat | grep –v grep # 将关键字所在行的前两行和后三行一起显示 dmesg | grep –n –A3 –B2 –color=auto 'eth'
更多grep命令例子见正则表达式
sed工具
用途:对数据进行替换、删除、新增、选取特定行、直接修改文件内容
sed [-nefr] [n1[,n2]] function
sed –f [filename]
set –i [n1[,n2]] function [filename]
n 安静模式,只有选取的那一行会被列出来
e 直接在命令行模式上进行sed的动作编辑
f 直接将sed的动作写在一个文件内,-f filename可以执行filename内的sed动作
r sed的动作支持的是扩展型正则表达式的语法,默认基础型
i 直接修改读取的文件内容,而不是由屏幕输出
n1,n2 代表进行动作的行数,不加代表全部,加则比如10(第10行)或10,20(10-20行)
function
a 新增,后接字符串,字符串在新的一行出现,目前的下一行
c 替换,后接字符串,字符串替换n1和n2之间的行
d 删除,后不跟参数
i 插入,后跟字符串,字符串在新的一行出现,目前的上一行
p 打印,将选择的数据打印出来,通常与sed –n一起运行
s 替换,后跟正则表达式,替换字符与被替换字符都在动作内包含
# 删除第2~5行 nl /etc/passwd | sed '2,5d' # 在第二行后面新增两行字 nl /etc/passwd | sed '2a Drink tea or[Enter]drink beer ?' 注:[Enter]为输入后按回车,即可表示新一行的开始’ # 替换第2~5行为”No 2-5 number” nl /etc/passwd | sed '2,5c No 2-5 number' # 查看第10~20行 nl /etc/passwd | sed '10,20p' # 通过s得到目前主机的ip ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' # 直接删除空白行(不用cat、vim等打开该文件) sed -i '/^[[:space:]]*$/d' /etc/passwd # 直接替换文件内字符串(不用cat、vim等打开该文件,适用于大文件的替换) sed –i 's/https://www.xxx.com:443/http://www.yyy.com/g' test.txt
行的排序命令
sort
用途:依据不同的数据类型来排序
sort [-fbMnrtuk] [file or stdin]
f 忽略大小写的差异
b 忽略最前面的空格符部分
M 以月份的名字来排序
n 以纯数字排序
r 反向排序
t 分隔符,默认使用[Tab]分隔
u unique,相同的数据只出现一行代表
k 以那个区间来进行排序
# 排序passwd,使用:做分隔符,使用第三列进行排序 cat /etc/passwd | sort -t ':' -k 3
行的统计命令
wc
用途:统计多少字、多少行、多少字符
wc [-lwm]
l 仅列出多少行
w 仅列出多少字(英文单字)
m 仅列出多少字符
uniq
用途:相同的数据,仅出现一行代表
特殊:可以计数
uniq [-ic]
i 忽略大小写,等效于sort -fu
c 进行计数
数据切割
cut
用途:将一行信息的某一段切出来
缺点:处理多空格相连的数据比较差
cut -d '分隔字符' -f fields
-d 后面接分割字符,与-f一起使用
-f 依据-d将一段信息切割成数段,用-f取出第几段
# 取出PATH的第五个路径 echo $PATH | cut -d ':' -f 5 # 取出PATH的第三个和第五个路径 echo $PATH | cut -d ':' -f 3,5
cut -c 字符范围
-c 以字符为单位取出固定字符区间
# 取出每一行12个字符之后的所有字符 export|cut -c 12- # 取出每一行第12~20之间的所有字符 export|cut -c 12-20
xargs
用途:分别通过分割(-i)与分批(-n)行为产生某个命令的参数
接收stdin,以指定字符进行分隔,将stdin分成多个arguments
主要用于连接两个非管道命令
xargs [-0edpni] command
0 将stdin中的特殊字符(如`,等)还原为一般字符
e 后接字符串,表示分析到指定字符串的时候,停止分析(end of file)
d 指定分割字符,而不是默认的空格符
p 执行每个命令,都会询问用户
n 指定每次command使用几个参数
i 不使用i只能传递到最后。使用-i后,可以使用{}指定将参数传递到哪,也可以多个
[yc@yc temp]$ cut -d ':' -f 1 /etc/passwd| sed -n '1,3p' | xargs -i id {} uid=0(root) gid=0(root) groups=0(root) uid=1(bin) gid=1(bin) groups=1(bin) uid=2(daemon) gid=2(daemon) groups=2(daemon)
awk
用途:以列为单位将一行数据分隔成数个“字段”来处理
awk ‘条件1{动作1} 条件2{动作2} ...’ filename
内置变量(可更改)
NF 每一行$0拥有的字段总数
NR 目前awk所处理的是“第几行”数据
FS 目前的分隔字符,默认空格键
$0 代表一整行数据
$1 代表第一个字段
$2 代表第二个字段
... ...
关键字
BEGIN 如果需要更改内置变量(如特殊的分隔字符),内置变量的更改默认情况下从第二行开始,使用BEGIN,代表从第一行之前就开始设置awk的内置变量,适用于特殊分隔字符+第一行也为所需要的数据的情况
END 同上,最后一行设置内置变量
简单用法:列出某一个字段
# 列出目前活动的进程号(第二个字段) ps aux | awk ‘{printf $2}’
高级用法:通过指定条件筛选行与列来得到想要的数据
使用内置变量+逻辑运算符筛选
显示有4个字段的一整行(NF+逻辑符+$0)
cat test.log | awk ‘NF==4{printf $0}’
显示第一行第二个和第四个字段+冒号:分隔符+printf简单定制(BEGIN+FS+NR+printf的单引号变双引号;空格变逗号)
cat test.log | awk ‘BEGIN {FS=”:”} NR==1{print “%s %s”,$2,$4}’
使用自定义变量+内置变量+逻辑运算符+多条命令作一个动作对数据+printf高级定制进行运算(FS+NR+printf的单引号变双引号;空格变逗号;分行必须用 +一个动作中多条命令用;分隔+变量声明不能用declare -i)
得到每一行的分数总和
cat test.log | awk 'NR==1{printf "%s %s %s %s %s %s ",$1,$2,$3,$4,$5,"total"} NR>=2{total=$2+$3+$4;printf "%s %i %i %i %3.2f %i ",$1,$2,$3,$4,$5,total}'
得到某一列的分数和
declare -i second=0;cat test.log|awk 'NR>=2{second=(second+$3)} NR==4{printf "%i ",second}'
高级awk用法
https://www.cnblogs.com/emanlee/p/3327576.html
字符转换命令
tr
用途:删除或替换一段信息当中的文字
tr [-ds] SET1 ...
无参数时进行替换操作
d 删除信息当中的SET1
s 重复的SET1只用一个表示
[yc@yc temp]$ cat a.log aab,bbc,ccd,dda AAB,BBC,CCD,DDA # 小写变大写 [yc@yc temp]$ cat a.log | tr '[a-d]' '[A-D]' AAB,BBC,CCD,DDA AAB,BBC,CCD,DDA # 小写去重复 [yc@yc temp]$ cat a.log | tr -s '[a-d]' ab,bc,cd,da AAB,BBC,CCD,DDA # 小写变大写去重复 [yc@yc temp]$ cat a.log | tr -s '[a-d]' '[A-D]' AB,BC,CD,DA AB,BC,CD,DA
col
用途:将[Tab]按键替换为对等的空格键
经常用来将man page转存为纯文本文件以方便查阅
col [-xb]
x 将[Tab]键转换为对等的空格键
b 文字内有/时,仅保留/最后接的那个字符
例
cat /etc/man.confg|col -x| cat -A| more
man col | col -b > /root/col.man
join
用途:两个文件当中有相同数据的那一行加在一起
注意:两个文件最好事先经过排序(相同数据那一行)
join [-ti12] file1 file2
t 指定分隔符号,默认空格符
i 忽略大小写
1 指定第一个文件用那个字段来分析
2 制定第二个文件用哪个字段来分析
例
将两个文件第一个字段相同者整成一行
join -t ':' /etc/passwd /etc/shadow
使用GID将两个文件整成一行
join -t ':' -1 4 /etc/passwd -2 3 /etc/shadow
注:结果GID会在第一列,其余列按顺序排列,相同的前几个字段不再出现
paste
用途:将两个文件每一行都粘在一起,[TAB]键隔开,不进行匹配,只复制粘贴
paste [-d] file1 file2
d 后接分隔字符,默认[TAB]
expand
将[TAB]键转换为空格键,可以自定义一个[TAB]键对应多少个字符
expand [-t] file
t 后接数字,默认为8个
unexpand
将空格转换为[Tab]键
unexpand [-at] file
a 转换所有空格
t 后接数字,默认为8个
unexpand [--first-only] file 仅转换开头
文件的相关处理
printf(printf不是管道命令,因为常用与管道命令,所以总结到此)
用途:将数据输出的结果格式化
printf ‘打印格式’ 实际内容
a 警告声音退出
退格键
f 清除屏幕
输出新的一行
[Enter]键
水平的[Tab]键
v 垂直的[Tab]键
xNN NN为两位数的数字,可以转换数字成为字符
常见的变量格式
%ns n为数字,s为string,即多少个字符
%ni n为数字,i为integer,即多少整数字数
%N.nf n与N都是数字,f为float,如果有小数字数,%10,2f表示10个整数位,2个小数位
例
printf '%s %s %s %s %s ' $(cat test.txt)
printf不是管道命令,只能用$()先执行获得stdout
%s表任意长度的字符串, 表示制表位[Tab]
printf '%10s %5i %5i %5i %8.2f ' $(cat test.txt) |grep -v Name
%10s表示10个长度的字符串
%5i表示5个长度的整数
$8.2f表示8个整数位,2个小数位的浮点数
printf 'x45 '
列出十六进制45代表的字符--E
文件切割命令
spilt
将一个大文件依据文件大小或行数来切割成为小文件
spilt [-bl] file PREFIX
b 后接欲切割的单位文件大小,可跟单位,b,k,m等
l 后接欲切割的单位文件行数
PREFIX 代表前导符,表示切割成为的文件名字的前几个字符
例
cd /tmp ; spilt -b 300k /etc/termcap termcap
得到termcapaa,termcapab,termcapac...
切割文件的合并
cd /tmp ; cat termcap* >> termcapbak