[关闭]
@yudesong 2018-02-12T02:57:14.000000Z 字数 8809 阅读 627

Linux 常用命令

Linux


tar

  1. #tar -zxvf /usr/local/test.tar.gz
  2. #tar -cvf test.tar.gz test
  3. tar 解压缩命令详解
  4. -c: 建立压缩档案
  5. -x:解压
  6. -t:查看内容
  7. -r:向压缩归档文件末尾追加文件
  8. -u:更新原压缩包中的文件

df、du

  1. df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
  2. [root@LinServ-1 ~]# df -h
  3. du显示每个文件和目录的磁盘使用空间
  4. du log2012.log
  5. du scf
  6. du -s scf

useradd

  1. useradd -u 544 -d /usr/testuser1 -g users -m testuser1
  2. 建立一个新用户账户testuser1,并设置UID544,主目录为/usr/testuser1,属于users组:
  3. -c:加上备注文字,备注文字保存在passwd的备注栏中。
  4. -d:指定用户登入时的主目录,替换系统默认值/home/<用户名>
  5. -D:变更预设值。
  6. -e:指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12。缺省表示永久有效。
  7. -f:指定在密码过期后多少天即关闭该账号。如果为0账号立即被停用;如果为-1则账号一直可用。默认值为-1.
  8. -g:指定用户所属的群组。值可以使组名也可以是GID。用户组必须已经存在的,期默认值为100,即users
  9. -G:指定用户所属的附加群组。
  10. -m:自动建立用户的登入目录。
  11. -M:不要自动建立用户的登入目录。
  12. -n:取消建立以用户名称为名的群组。
  13. -r:建立系统账号。
  14. -s:指定用户登入后所使用的shell。默认值为/bin/bash
  15. -u:指定用户ID号。该值在系统中必须是唯一的。0~499默认是保留给系统用户账号使用的,所以该值必须大于499

find 命令

  1. find ~ -name "*.log" -print
  2. find . -perm 755 -print
  3. find . ! -type d -print
  4. find /etc -type l -print
  5. find . -regex ".*\(\.txt\|\.pdf\)$"
  6. find . -path "./sk" -prune -o -name "*.txt" -print
  7. find . -empty

sort

  1. sort seq.txt
  2. sort -u seq.txt
  3. sort -r number.txt
  4. sort -r number.txt > number.txt
  5. sort -r number.txt -o number.txt
  6. sort -n number.txt
  7. sort -n -k 2 -t ‘:’ facebook.txt

dd

  1. dd if=/dev/zero of=sun.txt bs=1M count=1
  2. if 代表输入文件。如果不指定if,默认就会从stdin中读取输入。
  3. of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
  4. bs 代表字节为单位的块大小。
  5. count 代表被复制的块数。
  6. /dev/zero 是一个字符设备,会不断返回0值字节(\0)。

tr

  1. $ echo abcdef | tr 'abcdef' 'xyzabd'
  2. $ echo abcdef | tr 'a-f' 'x-za-c'
  3. echo "hello 123 world 456" | tr -d '0-9'
  4. cat text | tr '\t' ' '
  5. echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'
  6. echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ]

uniq

  1. sort file.txt | uniq
  2. sort file.txt | uniq -c
  3. sort file.txt | uniq -d

wc

  1. wc file.txt
  2. wc -l file.txt
  3. wc -w file.txt
  4. wc -c file.txt

sed

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本

常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。

常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

  1. [root@localhost ruby] # sed '1d' ab #删除第一行
  2. [root@localhost ruby] # sed '$d' ab #删除最后一行
  3. [root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行
  4. [root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行
  5. [root@localhost ruby] # sed -n '1p' ab #显示第一行
  6. [root@localhost ruby] # sed -n '$p' ab #显示最后一行
  7. [root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行
  8. [root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行
  9. [root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
  10. [root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
  11. [root@localhost ruby]# cat ab
  12. Hello!
  13. ruby is me,welcome to my blog.
  14. end
  15. [root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
  16. Hello!
  17. drink tea
  18. ruby is me,welcome to my blog.
  19. end
  20. [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
  21. Hello!
  22. drink tea
  23. ruby is me,welcome to my blog.
  24. drink tea
  25. end
  26. drink tea
  27. [root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
  28. Hello!
  29. drink tea
  30. or coffee
  31. ruby is me,welcome to my blog.
  32. end
  33.   代替一行或多行
  34. [root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi
  35. Hi
  36. ruby is me,welcome to my blog.
  37. end
  38. [root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi
  39. Hi
  40. end
  41.   替换一行中的某部分
  42.   格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
  43. [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
  44.   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
  45. 插入
  46. [root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
  47. [root@localhost ruby]# cat ab
  48. Hello!
  49. ruby is me,welcome to my blog.
  50. end
  51. bye
  52. 删除匹配行
  53. sed -i '/匹配字符串/d' filename (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
  54. 替换匹配行中的某个字符串
  55. sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

awk

  1.   awk是一个非常棒的数字处理工具。相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。运行效率高,而且代码简单,对格式化的文本处理能力超强。先来一个例子:
  2.   文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值。用awk来实现只需要一句话就可以搞定
  3. $cat a
  4. 1.021 33
  5. 1#.ll 44
  6. 2.53 6
  7. ss 7
  8. awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; len++}} END{print total/len}' a
  9. (分析:$1~/^[0-9]+\.[0-9]*/表示$1与“/ /”里面的正则表达式进行匹配,若匹配,则total加上$1,且len自增,即数目加1.“^[0-9]+\.[0-9]*”是个正则表达式,“^[0-9]”表示以数字开头,“\.”是转义的意思,表示“.”为小数点的意思。“[0-9]*”表示0个或多个数字)
  10. awk的一般语法格式为:
  11.   awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}'
  12. 其中:BEGINEND中的语句分别在开始读取文件(in_file)之前和读取完文件之后发挥作用,可以理解为初始化和扫尾。
  13. 1)参数说明:
  14.    -F re:允许awk更改其字段分隔符
  15. -v var=$v v值赋值给var,如果有多个变量要赋值,那么就写多个-v,每个变量赋值对应一个-v
  16.     e.g. 要打印文件a的第num行到num+num1行之间的行,
  17.       awk -v num=$num -v num1=$num1 'NR==num,NR==num+num1{print}' a
  18.   -f progfile:允许awk调用并执行progfile程序文件,当然progfile必须是一个符合awk语法的程序文件。
  19. 2awk内置变量:
  20. ARGC 命令行参数的个数
  21. ARGV 命令行参数数组
  22. ARGIND 当前被处理文件的ARGV标志符
  23. e.g 有两个文件a b
  24. awk '{if(ARGIND==1){print "处理a文件"} if(ARGIND==2){print "处理b文件"}}' a b
  25. 文件处理的顺序是先扫描完a文件,再扫描b文件
  26. NR   已经读出的记录数
  27. FNR  当前文件的记录数
  28. 上面的例子也可以写成这样:
  29. awk 'NR==FNR{print "处理文件a"} NR > FNR{print "处理文件b"}' a b
  30. 输入文件ab,由于先扫描a,所以扫描a的时候必然有NR==FNR,然后扫描b的时候,FNR1开始计数,而NR则接着a的行数继续计数,所以NR > FNR
  31. e.g 要显示文件的第10行至第15
  32. awk 'NR==10,NR==15{print}' a
  33. FS   输入字段分隔符(缺省为:space:),相当于-F选项
  34. awk -F ':' '{print}' a awk 'BEGIN{FS=":"}{print}' a 是一样的
  35. OFS输出字段分隔符(缺省为:space:)
  36. awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' b
  37. 如果cat b
  38. 1:2:3
  39. 4:5:6
  40. 那么把OFS设置成";"后就会输出
  41. 1;2;3
  42. 4;5;6
  43. (小注释:awk把分割后的第123个字段用$1,$2,$3...表示,$0表示整个记录(一般就是一整行))
  44. NF:当前记录中的字段个数
  45. awk -F ':' '{print NF}' b的输出为
  46. 3
  47. 3
  48. 表明b的每一行用分隔符":"分割后都3个字段
  49. 可以用NF来控制输出符合要求的字段数的行,这样可以处理掉一些异常的行
  50. awk -F ':' '{if (NF == 3)print}' b
  51. RS:输入记录分隔符,缺省为"\n"
  52. 缺省情况下,awk把一行看作一个记录;如果设置了RS,那么awk按照RS来分割记录
  53. 例如,如果文件ccat c
  54. hello world; I want to go swimming tomorrow;hiahia
  55. 运行 awk 'BEGIN{ RS = ";" } {print}' c 的结果为
  56. hello world
  57. I want to go swimming tomorrow
  58. hiahia
  59. 合理的使用RSFS可以使得awk处理更多模式的文档,例如可以一次处理多行,例如文档d cat d的输出为
  60. 1 2
  61. 3 4 5
  62. 6 7
  63. 8 9 10
  64. 11 12
  65. hello
  66. 每个记录使用空行分割,每个字段使用换行符分割,这样的awk也很好写
  67. awk 'BEGIN{ FS = "\n"; RS = ""} {print NF}' d 输出
  68. 2
  69. 3
  70. 1
  71. ORS:输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号
  72. awk 'BEGIN{ FS = "\n"; RS = ""; ORS = ";"} {print NF}' d 输出
  73. 2;3;1
  74. 3awk读取shell中的变量
  75. 可以使用-v选项实现功能
  76. $b=1
  77. $cat f
  78. apple
  79. $awk -v var=$b '{print var, $var}' f
  80. 1 apple
  81. 至于有没有办法把awk中的变量传给shell呢,这个问题我是这样理解的。shell调用awk实际上是fork一个子进程出来,而子进程是无法向父进程传递变量的,除非用重定向(包括管道)
  82. a=$(awk '{print $b, '$b'}' f)
  83. $echo $a
  84. apple 1
  85. 4)输出重定向
  86. awk的输出重定向类似于shell的重定向。重定向的目标文件名必须用双引号引用起来。
  87. $awk '$4 >=70 {print $1,$2 > "destfile" }' filename
  88. $awk '$4 >=70 {print $1,$2 >> "destfile" }' filename
  89. 5awk中调用shell命令:
  90. 1)使用管道
  91. awk中的管道概念和shell的管道类似,都是使用"|"符号。如果在awk程序中打开了管道,必须先关闭该管道才能打开另一个管道。也就是说一次只能打开一个管道。shell命令必须被双引号引用起来。“如果打算再次在awk程序中使用某个文件或管道进行读写,则可能要先关闭程序,因为其中的管道会保持打开状态直至脚本运行结束。注意,管道一旦被打开,就会保持打开状态直至awk退出。因此END块中的语句也会收到管道的影响。(可以在END的第一行关闭管道)”
  92. awk中使用管道有两种语法,分别是:
  93. awk output | shell input
  94. shell output | awk input
  95. 对于awk output | shell input来说,shell接收awk的输出,并进行处理。需要注意的是,awkoutput是先缓存在pipe中,等输出完毕后再调用shell命令 处理,shell命令只处理一次,而且处理的时机是“awk程序结束时,或者管道关闭时(需要显式的关闭管道)”
  96. $awk '/west/{count++} {printf "%s %s\t\t%-15s\n", $3,$4,$1 | "sort +1"} END{close "sort +1"; printf "The number of sales pers in the western"; printf "region is " count "." }' datafile (解释:/west/{count++}表示与“west进行匹配,若匹配,则count自增)
  97. printf函数用于将输出格式化并发送给管道。所有输出集齐后,被一同发送给sort命令。必须用与打开时完全相同的命令来关闭管道(sort +1),否则END块中的语句将与前面的输出一起被排序。此处的sort命令只执行一次。
  98. shell output | awk inputawkinput只能是getline函数。shell执行的结果缓存于pipe中,再传送给awk处理,如果有多行数据,awkgetline命令可能调用多次。
  99. $awk 'BEGIN{ while(("ls" | getline d) > 0) print d}' f
  100. 5awk结合match使用,提取匹配字符串:
  101. 文件内容:
  102. <key>hostname</key>
  103. <value>0.0.0.0</key>
  104. 要求提取0.0.0.0
  105. 命令:
  106. cat filename | grep -A 1 "hostname" |awk 'match($0, "<value>(.*)</value>", a) {print a[1]}'
  107. 其中 grep -A n,表示多往下输出n

more 命令功能:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按 q 键停止显示。

less 命令功能:less 命令的用法与 more 命令类似,也可以用来浏览超过一页的文件。所不同的是 less 命令除了可以按空格键向下显示文件外,还可以利用上下键来卷动文件。当要结束浏览时,只要在 less 命令的提示符“:”下按 q 键即可。

which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置。它一般用来确认系统中是否安装了指定的软件。

  1. which gcc
  2. which cd

whereis 命令主要用于定位可执行文件、源代码文件、帮助文件在文件系统中的位置。whereis 命令还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。 whereis 命令查找速度非常快,这是因为它根本不是在磁盘中漫无目的乱找,而是在一个数据库中(/var/lib/mlocate/)查询。这个数据库是 Linux 系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行 updatedb 命令更新一次。也正是因为这个数据库要每天才更新一次,就会使得 whereis 命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到。

  1. # 搜索 gcc 可执行文件的路径
  2. whereis -b gcc
  3. # 搜索 gcc 帮助文件的路径
  4. whereis -m gcc
  5. # 搜索 gcc 源代码的路径
  6. whereis -s gcc

locate 命令跟 whereis 命令类似,且它们使用的是相同的数据库。但 whereis 命令只能搜索可执行文件、联机帮助文件和源代码文件,如果要获得更全面的搜索结果,可以使用 locate 命令。 locate 命令使用了十分复杂的匹配语法,可以使用特殊字元(如’*’和’?’)来指定需要查找的样本。

  1. # 搜索 etc 目录下所有以 sh 开头的文件
  2. locate /etc/sh
  3. # 搜索 etc 目录下文件名包含 lou 的文件
  4. locate /etc/*lou*

find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作
参数:
-print find 命令将匹配的文件输出到标准输出
-exec find 命令对匹配的文件执行该参数所给出的 shell 命令
-name 按照文件名查找文件
-type 查找某一类型的文件
-prune 使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同 时使用-depth 选项,那么-prune 将被 find 命令忽略
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n +n 按照文件的更改时间来查找文件,-n 表示文件更改时间距现在小于 n天,+n 表示文件更改时间距现在大于 n 天,find 命令还有-atime 和 -ctime 选项

  1. # 打印当前目录下的文件目录列表
  2. find . -print
  3. # 打印当前目录下所有以.txt 结尾的文件名
  4. find . -name "*.txt" -print
  5. # 打印当前目录下所有以.txt 或.pdf 结尾的文件
  6. find . \( -name "*.pdf" -or -name "*.txt" \)
  7. # 打印当前目录下所有不以.txt 结尾的文件名
  8. find . ! -name "*.txt"
  9. # 打印当前目录下所有以.txt 结尾的符号链接
  10. find . -type l -name "*.txt" -print
  11. # 打印当前目录下所有权限为 777 的 php 文件(web 服务器上的 php 文件一般需要执行权限)
  12. find . -type f -name "*.php" -perm 777
  13. # 打印当前目录下 root 用户拥有的所有文件
  14. find . -type f -user root
  15. # 打印当前目录下权限不是 777 和 664 的所有文件
  16. find . -type f \( ! -perm 777 -and ! -perm 644 \)
  17. # 找到当前目录下所有 php 文件,并显示其详细信息
  18. find . -name "*.php" -exec ls -l {} \;
  19. # 在实验楼环境中有很多自己编写的 c 语言代码文件,现在想要把所有 c 语言代码文件下载下来,如果一个一个的下载很麻烦,我们可以先查找到所有的 c 语言代码文件,然后将这些文件内容写入到一个文件中,下载该文件
  20. find . -name "*.c" -exec cat {} \; > all.c
  21. 默认下,-exec 后面只能使用单个命令,如果想要多个命令,可以将多个命令写入脚本文件中,然后在-exec 中使用这个脚本,可以使用如下命令: find . -name "*.c" -exec ./command.sh {} \;

xargs 命令可以从标准输入接收输入,并把输入转换为一个特定的参数列表

  1. # 将多行输入转换为单行输出
  2. cat a.txt | xargs
  3. # 将单行输入转换为多行输出
  4. echo "1 2 3 4 5 6 7" | xargs -n 3
  5. # 将单行输入转换为多行输出,指定分隔符为 i
  6. cat b.txt | xargs -d i -n 3
  7. # 查找当前目录下所有 c 代码文件,统计总行数
  8. find . -type f -name "*.c" | xargs wc -l
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注