@yudesong
2018-02-12T02:57:14.000000Z
字数 8809
阅读 627
Linux
#tar -zxvf /usr/local/test.tar.gz#tar -cvf test.tar.gz testtar 解压缩命令详解-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件
df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。[root@LinServ-1 ~]# df -hdu显示每个文件和目录的磁盘使用空间du log2012.logdu scfdu -s scf
useradd -u 544 -d /usr/testuser1 -g users -m testuser1建立一个新用户账户testuser1,并设置UID为544,主目录为/usr/testuser1,属于users组:-c:加上备注文字,备注文字保存在passwd的备注栏中。-d:指定用户登入时的主目录,替换系统默认值/home/<用户名>-D:变更预设值。-e:指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12。缺省表示永久有效。-f:指定在密码过期后多少天即关闭该账号。如果为0账号立即被停用;如果为-1则账号一直可用。默认值为-1.-g:指定用户所属的群组。值可以使组名也可以是GID。用户组必须已经存在的,期默认值为100,即users。-G:指定用户所属的附加群组。-m:自动建立用户的登入目录。-M:不要自动建立用户的登入目录。-n:取消建立以用户名称为名的群组。-r:建立系统账号。-s:指定用户登入后所使用的shell。默认值为/bin/bash。-u:指定用户ID号。该值在系统中必须是唯一的。0~499默认是保留给系统用户账号使用的,所以该值必须大于499。
find ~ -name "*.log" -printfind . -perm 755 -printfind . ! -type d -printfind /etc -type l -printfind . -regex ".*\(\.txt\|\.pdf\)$"find . -path "./sk" -prune -o -name "*.txt" -printfind . -empty
sort seq.txtsort -u seq.txtsort -r number.txtsort -r number.txt > number.txtsort -r number.txt -o number.txtsort -n number.txtsort -n -k 2 -t ‘:’ facebook.txt
dd if=/dev/zero of=sun.txt bs=1M count=1if 代表输入文件。如果不指定if,默认就会从stdin中读取输入。of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。bs 代表字节为单位的块大小。count 代表被复制的块数。/dev/zero 是一个字符设备,会不断返回0值字节(\0)。
$ echo abcdef | tr 'abcdef' 'xyzabd'$ echo abcdef | tr 'a-f' 'x-za-c'echo "hello 123 world 456" | tr -d '0-9'cat text | tr '\t' ' 'echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ]
sort file.txt | uniqsort file.txt | uniq -csort file.txt | uniq -d
wc file.txtwc -l file.txtwc -w file.txtwc -c file.txt
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 就是啦!
[root@localhost ruby] # sed '1d' ab #删除第一行[root@localhost ruby] # sed '$d' ab #删除最后一行[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行[root@localhost ruby] # sed -n '1p' ab #显示第一行[root@localhost ruby] # sed -n '$p' ab #显示最后一行[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行[root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行[root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义[root@localhost ruby]# cat abHello!ruby is me,welcome to my blog.end[root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"Hello!drink tearuby is me,welcome to my blog.end[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"Hello!drink tearuby is me,welcome to my blog.drink teaenddrink tea[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\nHello!drink teaor coffeeruby is me,welcome to my blog.end代替一行或多行[root@localhost ruby] # sed '1c Hi' ab #第一行代替为HiHiruby is me,welcome to my blog.end[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为HiHiend替换一行中的某部分格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby插入[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"[root@localhost ruby]# cat abHello!ruby is me,welcome to my blog.endbye删除匹配行sed -i '/匹配字符串/d' filename (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)替换匹配行中的某个字符串sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
awk是一个非常棒的数字处理工具。相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。运行效率高,而且代码简单,对格式化的文本处理能力超强。先来一个例子:文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值。用awk来实现只需要一句话就可以搞定$cat a1.021 331#.ll 442.53 6ss 7awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; len++}} END{print total/len}' a(分析:$1~/^[0-9]+\.[0-9]*/表示$1与“/ /”里面的正则表达式进行匹配,若匹配,则total加上$1,且len自增,即数目加1.“^[0-9]+\.[0-9]*”是个正则表达式,“^[0-9]”表示以数字开头,“\.”是转义的意思,表示“.”为小数点的意思。“[0-9]*”表示0个或多个数字)awk的一般语法格式为:awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}'其中:BEGIN和END中的语句分别在开始读取文件(in_file)之前和读取完文件之后发挥作用,可以理解为初始化和扫尾。(1)参数说明:-F re:允许awk更改其字段分隔符-v var=$v 把v值赋值给var,如果有多个变量要赋值,那么就写多个-v,每个变量赋值对应一个-ve.g. 要打印文件a的第num行到num+num1行之间的行,awk -v num=$num -v num1=$num1 'NR==num,NR==num+num1{print}' a-f progfile:允许awk调用并执行progfile程序文件,当然progfile必须是一个符合awk语法的程序文件。(2)awk内置变量:ARGC 命令行参数的个数ARGV 命令行参数数组ARGIND 当前被处理文件的ARGV标志符e.g 有两个文件a 和bawk '{if(ARGIND==1){print "处理a文件"} if(ARGIND==2){print "处理b文件"}}' a b文件处理的顺序是先扫描完a文件,再扫描b文件NR 已经读出的记录数FNR 当前文件的记录数上面的例子也可以写成这样:awk 'NR==FNR{print "处理文件a"} NR > FNR{print "处理文件b"}' a b输入文件a和b,由于先扫描a,所以扫描a的时候必然有NR==FNR,然后扫描b的时候,FNR从1开始计数,而NR则接着a的行数继续计数,所以NR > FNRe.g 要显示文件的第10行至第15行awk 'NR==10,NR==15{print}' aFS 输入字段分隔符(缺省为:space:),相当于-F选项awk -F ':' '{print}' a 和 awk 'BEGIN{FS=":"}{print}' a 是一样的OFS输出字段分隔符(缺省为:space:)awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' b如果cat b为1:2:34:5:6那么把OFS设置成";"后就会输出1;2;34;5;6(小注释:awk把分割后的第1、2、3个字段用$1,$2,$3...表示,$0表示整个记录(一般就是一整行))NF:当前记录中的字段个数awk -F ':' '{print NF}' b的输出为33表明b的每一行用分隔符":"分割后都3个字段可以用NF来控制输出符合要求的字段数的行,这样可以处理掉一些异常的行awk -F ':' '{if (NF == 3)print}' bRS:输入记录分隔符,缺省为"\n"缺省情况下,awk把一行看作一个记录;如果设置了RS,那么awk按照RS来分割记录例如,如果文件c,cat c为hello world; I want to go swimming tomorrow;hiahia运行 awk 'BEGIN{ RS = ";" } {print}' c 的结果为hello worldI want to go swimming tomorrowhiahia合理的使用RS和FS可以使得awk处理更多模式的文档,例如可以一次处理多行,例如文档d cat d的输出为1 23 4 56 78 9 1011 12hello每个记录使用空行分割,每个字段使用换行符分割,这样的awk也很好写awk 'BEGIN{ FS = "\n"; RS = ""} {print NF}' d 输出231ORS:输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号awk 'BEGIN{ FS = "\n"; RS = ""; ORS = ";"} {print NF}' d 输出2;3;1(3)awk读取shell中的变量可以使用-v选项实现功能$b=1$cat fapple$awk -v var=$b '{print var, $var}' f1 apple至于有没有办法把awk中的变量传给shell呢,这个问题我是这样理解的。shell调用awk实际上是fork一个子进程出来,而子进程是无法向父进程传递变量的,除非用重定向(包括管道)a=$(awk '{print $b, '$b'}' f)$echo $aapple 1(4)输出重定向awk的输出重定向类似于shell的重定向。重定向的目标文件名必须用双引号引用起来。$awk '$4 >=70 {print $1,$2 > "destfile" }' filename$awk '$4 >=70 {print $1,$2 >> "destfile" }' filename(5)awk中调用shell命令:1)使用管道awk中的管道概念和shell的管道类似,都是使用"|"符号。如果在awk程序中打开了管道,必须先关闭该管道才能打开另一个管道。也就是说一次只能打开一个管道。shell命令必须被双引号引用起来。“如果打算再次在awk程序中使用某个文件或管道进行读写,则可能要先关闭程序,因为其中的管道会保持打开状态直至脚本运行结束。注意,管道一旦被打开,就会保持打开状态直至awk退出。因此END块中的语句也会收到管道的影响。(可以在END的第一行关闭管道)”awk中使用管道有两种语法,分别是:awk output | shell inputshell output | awk input对于awk output | shell input来说,shell接收awk的输出,并进行处理。需要注意的是,awk的output是先缓存在pipe中,等输出完毕后再调用shell命令 处理,shell命令只处理一次,而且处理的时机是“awk程序结束时,或者管道关闭时(需要显式的关闭管道)”$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++}表示与“wes”t进行匹配,若匹配,则count自增)printf函数用于将输出格式化并发送给管道。所有输出集齐后,被一同发送给sort命令。必须用与打开时完全相同的命令来关闭管道(sort +1),否则END块中的语句将与前面的输出一起被排序。此处的sort命令只执行一次。在shell output | awk input中awk的input只能是getline函数。shell执行的结果缓存于pipe中,再传送给awk处理,如果有多行数据,awk的getline命令可能调用多次。$awk 'BEGIN{ while(("ls" | getline d) > 0) print d}' f(5)awk结合match使用,提取匹配字符串:文件内容:<key>hostname</key><value>0.0.0.0</key>要求提取0.0.0.0命令:cat filename | grep -A 1 "hostname" |awk 'match($0, "<value>(.*)</value>", a) {print a[1]}'其中 grep -A n,表示多往下输出n行
more 命令功能:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按 q 键停止显示。
less 命令功能:less 命令的用法与 more 命令类似,也可以用来浏览超过一页的文件。所不同的是 less 命令除了可以按空格键向下显示文件外,还可以利用上下键来卷动文件。当要结束浏览时,只要在 less 命令的提示符“:”下按 q 键即可。
which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置。它一般用来确认系统中是否安装了指定的软件。
which gccwhich cd
whereis 命令主要用于定位可执行文件、源代码文件、帮助文件在文件系统中的位置。whereis 命令还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。 whereis 命令查找速度非常快,这是因为它根本不是在磁盘中漫无目的乱找,而是在一个数据库中(/var/lib/mlocate/)查询。这个数据库是 Linux 系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行 updatedb 命令更新一次。也正是因为这个数据库要每天才更新一次,就会使得 whereis 命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到。
# 搜索 gcc 可执行文件的路径whereis -b gcc# 搜索 gcc 帮助文件的路径whereis -m gcc# 搜索 gcc 源代码的路径whereis -s gcc
locate 命令跟 whereis 命令类似,且它们使用的是相同的数据库。但 whereis 命令只能搜索可执行文件、联机帮助文件和源代码文件,如果要获得更全面的搜索结果,可以使用 locate 命令。 locate 命令使用了十分复杂的匹配语法,可以使用特殊字元(如’*’和’?’)来指定需要查找的样本。
# 搜索 etc 目录下所有以 sh 开头的文件locate /etc/sh# 搜索 etc 目录下文件名包含 lou 的文件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 选项
# 打印当前目录下的文件目录列表find . -print# 打印当前目录下所有以.txt 结尾的文件名find . -name "*.txt" -print# 打印当前目录下所有以.txt 或.pdf 结尾的文件find . \( -name "*.pdf" -or -name "*.txt" \)# 打印当前目录下所有不以.txt 结尾的文件名find . ! -name "*.txt"# 打印当前目录下所有以.txt 结尾的符号链接find . -type l -name "*.txt" -print# 打印当前目录下所有权限为 777 的 php 文件(web 服务器上的 php 文件一般需要执行权限)find . -type f -name "*.php" -perm 777# 打印当前目录下 root 用户拥有的所有文件find . -type f -user root# 打印当前目录下权限不是 777 和 664 的所有文件find . -type f \( ! -perm 777 -and ! -perm 644 \)# 找到当前目录下所有 php 文件,并显示其详细信息find . -name "*.php" -exec ls -l {} \;# 在实验楼环境中有很多自己编写的 c 语言代码文件,现在想要把所有 c 语言代码文件下载下来,如果一个一个的下载很麻烦,我们可以先查找到所有的 c 语言代码文件,然后将这些文件内容写入到一个文件中,下载该文件find . -name "*.c" -exec cat {} \; > all.c默认下,-exec 后面只能使用单个命令,如果想要多个命令,可以将多个命令写入脚本文件中,然后在-exec 中使用这个脚本,可以使用如下命令: find . -name "*.c" -exec ./command.sh {} \;
xargs 命令可以从标准输入接收输入,并把输入转换为一个特定的参数列表
# 将多行输入转换为单行输出cat a.txt | xargs# 将单行输入转换为多行输出echo "1 2 3 4 5 6 7" | xargs -n 3# 将单行输入转换为多行输出,指定分隔符为 icat b.txt | xargs -d i -n 3# 查找当前目录下所有 c 代码文件,统计总行数find . -type f -name "*.c" | xargs wc -l