linux 常用命令

linux 常用命令,比较杂
PS: 部分fork自大师兄个人网站

1. 一句一命令系列

tac: cat倒过来写,将文件以line为单位反向输出。
join: 将两个文件里指定栏同样的行拼接起来,即依照两个文件里共有的一列,将相应的行拼起来。join file1 file2 默认两个文件的第一列为匹配域。具体用法可以参考[这里](http://www.cnblogs.com/mfryf/p/3402200.html)
paste:将两个文件按列拼接起来

2. !命令

!#,引用当前的命令行,例如:cp filename filename.bak 可以写为 cp filename !#:1.bak note: :1 表示选择当前行命令的第一个参数
!-n 重复执行倒数第 n 条命令,n 为正整数
!! 重复执行上一条命令。该命令等价于 !-1
!^ 重用上一条命令的第一个参数 ls /usr/share/doc /usr/share/man; cd !^# 即 cd /usr/share/doc
!$ 重用上一条命令的最后一个参数
!* 重用上一条命令的所有参数 touch t1 t2 t3rm !*rm t1 t2 t3
!!:n 重用上一条命令中的第n个参数,n为正整数。touch t1 t2 t3rm !!:2touch t2
!str:x-y 重用上一条以str开头的命令的第x到第y个参数。touch t1 t2 t3rm !touch:2:3rm t2 t3
!?str:n* 重用上一条包含 str 的命令的从第 n 个到最后一个参数

3. 用一个命令将一个文件复制到多个目录-xargs命令

3.1. 基本用法

echo dir1 dir2 dir3 | xargs -n 1 cp file1 #-n 1命令选项告诉xargs一次只传递一个参数给cp命令,即dir1 dir2 dir3被分割成三个参数,每次cp命令用一个

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

新建一个测试文件,内有多行数据

cat test.txt

a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z

多行输入单行输出:

cat test.txt | xargs

a b c d e f g h i j k l m n o p q r s t u v w x y z

-n选项多行输出:

cat test.txt | xargs -n3

a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z

-d选项可以自定义一个定界符:

echo "nameXnameXnameXname" | xargs -dX

name name name name

xargs的一个选项-I,使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,当-I与xargs结合使用,每一个参数命令都会被执行一次:

cat arg.txt | xargs -I {} ./sk.sh -p {} -l

-p aaa -l
-p bbb -l
-p ccc -l

复制所有图片文件到 /data/images 目录下:

ls *.jpg | xargs -n1 -I cp {} /data/images

Note: 这里-I的替换功能更像是一个占位符号

3.2. xargs结合find使用

用rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用xargs去避免这个问题:

find . -type f -name "*.log" -print0 | xargs -0 rm -f

xargs -0将\0作为定界符(-0等于–null)。

统计一个源代码目录中所有php文件的行数:

find . -type f -name "*.php" -print0 | xargs -0 wc -l #这里因为要统计每个文件的行数,每次wc接收一个参数,所以必须用-print0将find找到的文件名分割开来

查找所有的jpg 文件,并且压缩它们:

find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz # 这里的tar要求一次性接收所有的压缩文件名,分隔符好就是newline字符

Note: 关于\0与-print0

find 命令中对-print0选项的解释
True; print the full file name on the standard output, followed by a null character (instead of the newline character that -print uses). This allows file names that contain newlines or other types of white space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs. 即将打印在标准输出的文件名的末尾换成一个null 字符,而不是newline字符。这样,find命令输出的文件名才能被其他调用的程序所识别。比如xargs命令

3.3. xargs其他应用:

假如你有一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接:

cat url-list.txt | xargs wget -c

4. cut命令

cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和几的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。
cut命令应用实例

a=`wc -l 1us.xv |cut -d " " -f1`; echo $((a/2401))
# 统计一个不断更新的坐标文件,并计算frames数目
cut (选项)(参数)

选项:
-b:仅显示行中指定直接范围的内容;
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
-n:与“-b”选项连用,不分割多字节字符;
--complement:补足被选择的字节、字符或字段;
--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。

举个栗子

# cat test.txt 
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98

# cut -f 1 test.txt 
No
01
02
03

cut -f2,3 test.txt 
Name Mark
tom 69
jack 71
alex 68

cut命令可以将一串字符作为列来显示,字符字段的记法:

N-:从第N个字节、字符、字段到结尾;
N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
-M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。
上面是记法,结合下面选项将摸个范围的字节、字符指定为字段:

-b 表示字节;
-c 表示字符;
-f 表示定义字段。

平时用的最多的自然是cut某个列,而文件中的分隔符并不总是默认值TAB,有时候是空格,所以这时候要用cut -f2 -d file2.txt,才能切出文件的第二列。

Mandatory arguments “强制性参数”,与此对应的是Optional arguments “可选参数”。例如,cut OPTION... [FILE]...表示OPTION是必须写的,二加了[]的FILE是可选的,因为这个输入可以来源于standard input,比如echo "x1 x2 x3" |cut f2,3 -d " " -,输出为x2 x3

5. paste命令

cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件。
粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。

paste格式为: 
paste -d -s -file1 file2 
选项含义如下: 
-d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用- d @。 
-s 将每个文件合并成行而不是按行粘贴。 
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。

例子:

#cat pas1 
ID897 
ID666 
ID982 
#cat pas2 
P.Jones 
S.Round 
L.Clip

基本paste命令将pas1和pas2两文件粘贴成两列:

# paste pas1 pas2 
ID897   P.Jones 
ID666   S.Round 
ID982   L.Clip

通过交换文件名即可指定哪一列先粘:

# paste pas2 pas1 
P.Jones ID897 
S.Round ID666 
L.Clip ID982

要创建不同于空格或tab键的域分隔符,使用-d选项。下面的例子用冒号做域分隔符。

# paste -d: pas2 pas1 
P.Jones:ID897 
S.Round:ID666 
L.Clip:ID982

要合并两行,而不是按行粘贴,可以使用-s选项。下面的例子中,第一行粘贴为ID号,第二行是名字。

# paste -s pas1 pas2 
ID897   ID666   ID982 
P.Jones S.Round L.Clip

paste命令还有一个很有用的选项(-)。意即对每一个(-),从标准输入中读一次数据。使用空格作域分隔符,以一个6列格式显示目录列表。方法如下

# ls /usr/local | paste -d" " - - - - - -
bin cuda cuda-9.1 etc games include
lib lib64 libexec sbin share src

也可以以两列格式显示输出:

# ls /usr/local | paste -d" " - - - - - -
bin cuda
cuda-9.1 etc
games include
lib lib64
libexec sbin
share src

6. linux shell 1>/dev/null 2>&1用法

/dev/null :代表空设备文件
>  :代表重定向到哪里,例如:echo "123" > /home/123.txt
1  :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2  :表示stderr标准错误
&  :表示等同于的意思,2>&1,表示2的输出重定向等同于1

1 > /dev/null 2>&1 语句含义:

  1. 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
  2. 2>&1 :接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

7. linux切分路径文件名的命令basename,dirname

basenamedirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。
举个栗子:

file=/home/tom/program.c
basename $file #输出:program.c
basename $file .c #输出:program,即可以加命令选项去除尾部的匹配字符。

dirname命令去除文件名中的非目录部分,仅显示与目录有关的内容。dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出。如果最后一个/后无字符,dirname 命令使用倒数第二个/,并忽略其后的所有字符。

file=/home/tom/program.c
dirname $file #输出:/home/tom
dir=/home/tom
dirname $dir #输出:/home