linux常见命令

管道命令 | , 将前面命令的正确信息 传递给后面的命令作标准输入。 |仅能处理标准输出,对stderr没有直接处理能力.
$ls -al |more
ls 的结果被more读取。

选取命令 cut,grep

注意选取的信息是以行为单位的,即是逐行分析的。
cut  用于使用分割符切割每一行
-d '分割符'
-f m,n... 指定取出的第几段, 以逗号分隔,指定都是哪几个段,比如 -f1,3,4 指定取出第1,3,4段
-c 以字符为单位取出固定的字符范围 比如 cut -c 12- ,每行 第12个字符以后的所有内容, cut -c 12-20 ,每行 第12到20 字符之间的内容
例子
woody@xiaoc:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
woody@xiaoc:~$ echo $PATH |cut -d ':' -f 5
/sbin
woody@xiaoc:~$ echo $PATH |cut -d ':' -f 2,4 //第2段和第4段,:分隔
/usr/local/bin:/usr/bin
woody@xiaoc:~$

woody@xiaoc:~$ export
declare -x COLORTERM="Terminal"
declare -x DISPLAY=":0.0"
declare -x GTK_IM_MODULE="xim"
declare -x HISTCONTROL="ignoreboth"
declare -x HOME="/home/woody"
declare -x LANG="en_US.UTF-8"
declare -x LC_CTYPE="zh_CN.UTF-8"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LOGNAME="woody"
.....省略
woody@xiaoc:~$ export | cut -c 12-          //输出每行 第12个字符以后的内容
COLORTERM="Terminal"
DISPLAY=":0.0"
GTK_IM_MODULE="xim"
HISTCONTROL="ignoreboth"
HOME="/home/woody"
LANG="en_US.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LESSCLOSE="/usr/bin/lesspipe %s %s"
LESSOPEN="| /usr/bin/lesspipe %s"
LOGNAME="woody"
.....省略

grep : 分析每一行,如果行中有需要的信息,则输出该行
grep -[acinv] '搜索内容串' filename
-a 以文本文件方式搜索
-c 计算找到的符合行的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择,即找 没有搜索字符串的行

例子
woody@xiaoc:~$ last | grep 'tty2'           //找出last结果中 有tty2 的行
woody    tty2                          Sat Aug 30 17:14 - 17:14 (00:00)   
woody    tty2                          Sat Aug 30 17:14 - 17:14 (00:00)   
woody    tty2                          Sun Jul 20 22:06 - down   (00:07)   
woody    tty2                          Sun Jul 20 22:06 - 22:06 (00:00)   
woody    tty2                          Sun Jul 20 21:35 - down   (00:29)   
woody    tty2                          Sun Jul 20 21:35 - 21:35 (00:00)   
woody    tty2                          Mon Jul 21 04:32 - down   (01:00)   
woody    tty2                          Mon Jul 21 04:32 - 04:32 (00:00)   
woody    tty2                          Mon Jul 21 04:08 - down   (00:00)   
woody    tty2                          Mon Jul 21 04:08 - 04:08 (00:00)   
woody@xiaoc:~$
woody@xiaoc:~$ last | grep -v 'tty2' //找没有tty2的行...
woody    pts/0        :0.0             Sat Aug 30 17:42   still logged in  
woody    pts/0        :0.0             Sat Aug 30 17:42 - 17:42 (00:00)   
woody    pts/0        :0.0             Sat Aug 30 17:41 - 17:42 (00:00)   
woody    tty1                          Sat Aug 30 17:23 - 17:23 (00:00)   
woody    tty1                          Sat Aug 30 17:23 - 17:23 (00:00)   
woody    tty1                          Sat Aug 30 17:19 - 17:20 (00:00)   
woody    tty1                          Sat Aug 30 17:19 - 17:19 (00:00)   
woody    tty1                          Sat Aug 30 17:17 - 17:17 (00:00)   
woody    tty1                          Sat Aug 30 17:17 - 17:17 (00:00)
省略。。。。

综合利用:
woody@xiaoc:~$ sudo cat /etc/shadow
root:!:14080:0:99999:7:::
daemon:*:14080:0:99999:7:::
bin:*:14080:0:99999:7:::
sys:*:14080:0:99999:7:::
sync:*:14080:0:99999:7:::
games:*:14080:0:99999:7:::
man:*:14080:0:99999:7:::
省略...
woody@xiaoc:~$ sudo cat /etc/shadow |grep 'root' |cut -d ':' -f 1,2 //找到有root的行,取出:分割的前两个段内容
root:!
woody@xiaoc:~$

排序命令
sort 帮助我们排序,排序的字符跟语系编码有关系,因此排序前建议使用LC_ALL=C,让语系统一。
-f 忽略大小写
-b 忽略前面空格
-M 以月份名字排序例如 JAN,DEC等
-n 以纯数字方式排序,默认是字符串模式
-u uniq 相同数据显示一次
-t 分割符号,默认是tab
-k 按哪个字段(分割开得)排序
具体看man手册
woody@xiaoc:~$ cat /etc/passwd |sort
backup:x:34:34:backup:/var/backups:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
dhcp:x:101:102::/nonexistent:/bin/false
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/bin/false
games:x:5:60:games:/usr/games:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
haldaemon:x:106:115:Hardware abstraction layer,,,:/var/run/hald:/bin/false
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
klog:x:103:104::/home/klog:/bin/false
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
......
woody@xiaoc:~$ cat /etc/passwd |sort -t ":" -k 3 -n //按照:分割的第三栏来排序, 数字方式
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh


uniq 将重复数据只显示一次

-i 忽略大小写,
-c 计数

wc 统计文件中多少字多少行多少字符。
-l ,只显示行数
-w 仅字(英文单词,连着的汉字字符串是一个字 )
-m 多少字符
vim 中好像总多一个不可见的结束符。utf-8编码下,一个汉字是3个字符大小.

tee 命令,双向重定向
我们知道> 会将数据传送给文件或设备,但是这样后标准输出中就没有内容了。如果想将信息既导向设备或文件,又分流到标准输出,可以用tee命令

tee [-a] file
-a 追加方式
woody@xiaoc:~$ last | tee last.list | cut -d ' ' -f1 //既将last输出保存到了last.list文件,又将last输出导向给cut命令.
woody
woody
woody
woody
woody
woody
woody
woody
....

字符转换命令 tr,col,join,paste expand
tr [-ds] charset
-d 删除消息中的char set 中包含的字符
-s 替换重复的字符

他的替换方式似乎是一一对应的,比如 tr 'woody' 'WOODY' 会将信息中所有的w替换为W,所有o替换成O..

例子,将小写变大写
$last | tr '[a-z]' '[A-Z]'

将输出中的:删除
$cat /etc/passwd | tr -d ':'

将dos文件中的^M删除
$cat file |tr -d '\r' > newfile
\r 表示^M. DOS文件中会在行尾添加^M,而linux没有。

col -x 用来将tab 替换成对等的空格
woody@xiaoc:~$ cat -A /etc/manpath.config
.......
# --------------------------------------------------------$
# MANDATORY_MANPATH^I^I^Imanpath_element$
# MANPATH_MAP^I^Ipath_element^Imanpath_element$
# MANDB_MAP^I^Iglobal_manpath^I[relative_catpath]$
#---------------------------------------------------------$
# every automatically generated MANPATH includes these fields$

我们看到许多^I ,是tab键的显示。
要将他们换成空格显示,可以这样:
woody@xiaoc:~$ cat /etc/manpath.config | col -x |cat -A|more


也不怎么常用。

join , 将两个文件中,有相同数据的行加在一起。
-t 默认以空格分割数据,并比较第一个字段的数据,相同则将两个数据连成一行。
-i 大小写忽略
-1 第一个文件用哪个字段分析
-2 第二个文件用哪个字段分析

例子:
woody@xiaoc:~$ sudo join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:!:14080:0:99999:7:::
daemon:x:1:1:daemon:/usr/sbin:/bin/sh:*:14080:0:99999:7:::
bin:x:2:2:bin:/bin:/bin/sh:*:14080:0:99999:7:::


因为passwd 和shadow以:分割的第一个字段都是帐号名, 因此有相同帐号名的两文件中的行合并了,
由于帐号名相同,第二个文件的帐号名就省略了。红色是第二个文件的。


例子
/etc/passwd 第四字段是GID,/etc/group 第三个字段是GID, 整合命令
woody@xiaoc:~$ sudo join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:
1:daemon:x:1:daemon:/usr/sbin:/bin/sh:daemon:x:
2:bin:x:2:bin:/bin:/bin/sh:bin:x:
...
/etc/passwd 第一行: root:x:0:0:root:/root:/bin/bash
/etc/group 第一行 root:x:0:
将第一个的第四栏0 与第二个文件的第三栏0 取出,放到行的最前方。
然后将剩余的东西加在一起放在后面,就得到输出了。

paste 这个比join简单,只是将两个文件的两行合并,以tab分隔
-d 加分隔符号 ,默认tab
- 说明内容是来自标准输入。
woody@xiaoc:~/tmp$ paste file1 file2
this is a file this is a file                //两个文件内容相同,因此结果是这样
this is a test this is a test
this file is using paste command.       this file is using paste command.
EOF     EOF
woody@xiaoc:~/tmp$ paste file1 - //使用标准输入作另一个文件来源
this is a file fuck //标准输入fuck后将fuck与第一行合并
fuck //这是标准输入的内容,不是文件合并后的显示
this is a test hello
hello
this file is using paste command.       Im the second
Im the second
.........

expand 将tab转成空格 ,col也可以完成该功能

-t 指定一个tab占多少空格
woody@xiaoc:~/tmp$ grep 'MANPATH' /etc/manpath.config | head -n 3|cat -A
# MANDATORY_MANPATH^I^I^Imanpath_element$
# MANPATH_MAP^I^I path_element^Imanpath_element$
# every automatically generated MANPATH includes these fields$
woody@xiaoc:~/tmp$ grep 'MANPATH' /etc/manpath.config | head -n 3|expand -t 6| cat -A
# MANDATORY_MANPATH                 manpath_element$
# MANPATH_MAP           path_element      manpath_element$
# every automatically generated MANPATH includes these fields$
woody@xiaoc:~/tmp$
tab是^I

unexpand命令可以完成逆向工作

split, 可以将大文件分割为小文件,方便复制传送等工作。
-b 后接拆分后单个小文件的大小,可加单位,b,k,m等
-l 按照行数拆分。
$split -b 100m movie.rmvb small_mov

得到结果 small_mova,small_movb.... 依次加上abcd..得到多个100m以内的小文件

要合并他们:
$cat small_mov* >> new_mov.rmvb

cat 可以将多个文件合并输出,比如 cat file1 file2 得到file1 和file2 的输出.
cat 不加参数,则从标准输入(键盘)获取,以ctrl+d 结束输入。


按行数
woody@xiaoc:~$ ls -al / |split -l 10 - lsroot
将结果生成10行一个的文件 lsroota,lsrootb....
注意那个红色的- 符号,在需要标准输入输出时,恰好没有文件时,则-当成输入/输出
这里split 的结果经过 -(输出) 到lsroota,lsrootb..

关于减号- 的作用,
在管道命令中,常常会用到前一个命令的stdout作后面命令的stdin, stdin/stdout 可以用减号-代替,比如
$tar -cvf - /home | tar -xvf -
这里将/home里的文件打包,但是不生成文件,而是将数据传送到 stdout ,即-,经过管道,将数据传送给
tar -xvf - ,后面这个- 则是取前一个命令的stdout 做stdin用,也就不需要文件了。


参数替换 xargs,以空格分隔输入,产生某个命令的参数,如果一些文件名之类的名字里含有空格,xargs可能会误判。
-0 如果输入的stdin中有特殊字符,如`, \, 空格等,使用-0 将其还原为一般字符
-e EOF的意思,-e后紧跟一个字符串,则分析到这个字符串(空格分割出来的单独参数,而不是参数的一部分)时就停止工作。忽略它并停止分析
-p 执行每个命令的参数时,询问用户
-n 每次后面的命令执行时需要几个参数,
当xargs后面没接命令时,默认echo输出。

woody@xiaoc:~$ cut -d':' -f1 < /etc/passwd | head -n 3 |xargs touch
woody@xiaoc:~$ ls
abc ok? bin      Desktop Downloads    playlist tmp         wallpapers
Backup   daemon doc      linux_c_src root       vbox_share xrgsu
woody@xiaoc:~$
这里 将passwd 前三行取出,使用cut 取出第一栏(帐户名) 作为参数传递给touch, 则创建了三个文件。

woody@xiaoc:~$ cut -d':' -f1 < /etc/passwd | head -n 3 |xargs -p touch   //带提示的用法
touch root daemon bin ?...y

使用-e 令当分析到某个参数是sys时,忽略它和后面的参数。
woody@xiaoc:~$ rm bin daemon root //删除之前创建的文件先
woody@xiaoc:~$ cut -d':' -f1 < /etc/passwd | head -n 5 |xargs -p -e'sys' touch
touch root daemon bin ?...y   //看,没有sys和后面的
woody@xiaoc:~$ ls
abc ok? bin     Desktop Downloads    playlist tmp         wallpapers
Backup   daemon doc      linux_c_src root      vbox_share xrgsu
woody@xiaoc:~$

使用-n ,指定命令需要的参数为2个,这样分析出的参数2个一组,每组分别执行后面的命令。
woody@xiaoc:~$ cut -d':' -f1 < /etc/passwd | head -n 5 |xargs -n 2       //默认echo 输出得到的参数
root daemon        //看两个一组
bin sys
sync

woody@xiaoc:~$

xargs命令很有用,具体参考man手册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值