Shell 命令--文件创建、搜索命令--总结自《Linux Shell 脚本攻略》

(一)文件创建命令

1.touch命令

比如:touch abc命令在本地文件夹中创建了一个名为abc的空文件

2.cp命令

cp命令同意我们把一个文件的内容拷贝到同名或不同名的文件里,复制得到的文件能够在不论什么文件夹。使用cp命令的一个风险是它会在不提示用户的情况下非常easy覆盖掉不同文件夹中的文件
-r选项支持递归复制。比如:cp -ar /usr/share/doc/. /doc/ 将复制源文件夹中全部子文件夹以及相关文件

3.mv命令

mv命令实质上市给文件贴上不同的标签,比如:mv file1 file2 命令就是把file1的名字改为file2
mv命令也能够用于文件夹

4.ln命令

链接文件同意用户编辑不同文件夹中的同一个文件
硬链接包括了文件的一个副本。仅仅要硬链接文件是在同一个分区中。则它们的索引號同样 ln /etc/samba/smb.conf smb.conf
软连接起着重定向的作用。当我们打开一个用软链接创建的文件时,则链接把我们重定向到原来的文件。ln -s /etc/samba/smb.conf smb.conf

5.rm命令

-r开关选项能够按递归方式进行
-f开关选项能够覆盖掉不论什么安全措施  rm -rf  /root/a/b

6.文件夹创建和删除

mkdir和rmdir命令用于创建和删除文件夹
-p  no error if existing, make parent directories as needed
比如 mkdir -p /test1/test2/test3 
rmdir -p /test1/test2/test3

7.alias命令

能够用来简化几个命令。

对于root用户。默认的别名能够提供一点安全性

(二)文件搜索

1.find命令

find / -name name.conf 此命令从根文件夹開始搜索
find /usr -name name.conf 从/usr文件夹下開始搜索

2.locate命令

RHEL同意用户创建一个数据库,它保存了所有的安装文件和文件夹。locate命令的缺点是此数据库通常每天仅仅更新一次。这在/etc/cron.daily/mlocate.cron脚本文件里有记录
这个脚本文件能够直接由root用户从命令行接口中运行。

仅仅要输入这个文件的完整文件夹即可

(三)文本文件的管理

1.cat命令

最简单的文本文件读取命令是cat。cat filename命令能够翻页显示filename文件的内容。

2.less和more命令

用more filename命令能够翻页显示文本文件的内容,每次一个屏幕从头到尾显示
用less filename命令。我们能够用PAGE UP和PAGE DOWN键向前或向后翻页查看铜件的文本,按q退出
less命令有几个功能是more和cat这两个命令所没有的。它能够读取用Gzip格式压缩的文本文件,通常这样的文件的扩展名为.gz

3.head和tail命令

head 命令读取文件的头部
语法:$ head –n N file 打印前N行 $ head –n -N file 打印除最后N行外的全部行
tail命令总是读取文件的尾部
语法:$ tail –n N file 打印后N行 $ taill –n +N file 打印除了前N行之外的全部行

(四)处理文本流的命令

文本流就是数据的流动。比如,cat filename命令把来自filename的数据流输出到屏幕上。当这些文件变大时,最好先用过滤器命令对这些流进行处理。

1.sort命令

能够用多种方法对文件的内容进行排序。默认情况下,sort命令依照字母顺序将文件内容按每行首字符进行排序。

2.grep命令

grep命令用于文本搜索,默认读取一个文件的全部行
$ grep match_pattern filename 或者 $ grep “match_pattern” filename
一个grep命令也能够对多个文件进行搜索 $grep "match_text" file1 file2 file3 ...
grep命令通常将match_pattern视为通配符。

假设要使用正則表達式,须要加入-E选项——这意味着使用扩展(extended)正則表達式,或者使用默认同意正則表達式的egrep命令。 比如: $ grep -E "[a-z]+" 或者 $egrep "[a-z]" 匹配url的正則表達式 $ egrep -o "http://[a-zA-Z0-9.]+.[a-zA-z]{2,3}" index.html --color=atuto 选项:能够在输出行中重点标记出匹配到的单词 -o选项:仅仅输出文件里匹配到的文本部分。

比如:输出每一个单词 echo this is a test file | egrep -o "[[:alpha:]]+" -v选项:打印包括match_pattern的行之外的全部行 -c选项:统计文件或文本中包括匹配字符串的行数 -b选项: 打印样式匹配所位于的字符或字节偏移,选项-b总是和-o配合使用 比如:$echo gnu is not unix | grep -b -o "not" 其它选项: 1)递归搜索文件 $ grep "text' . -R -n 2)  忽略样式中的大写和小写 $ echo hello world | grep -i "HELLO" 3)  用grep匹配多个样式 $ grep -e "pattern1" -e "pattern2" 或者 在样式文件里逐行写下须要匹配的样式,然后用选项-f运行grep。

$echo hello this is cool | grep -f pat_file 4)  在grep搜索中包括或排除文件   仅仅在文件夹中递归搜索全部的.c和.cpp文件: $ grep "main()" . -r --include *.{c,cpp} 注意:some{string1,string2}会扩展成somestring1 somestring2 在搜索中排除全部的README文件: $ grep "main()" . -r --exclude "README" 假设要排除文件夹,能够使用 --exclude-dir 选项 假设须要从文件里读取所须要排除的文件列表,使用 --exclude-from FILE 5)  使用0值字节后缀的grep与xargs 在以下的命令序列中,grep输出以0值字节作为终结符的文件()。

这能够用grep的-Z选项来指定。xargs -0 读取输入并用0值字节终结符切割文件名称: $ grep "test" file* -lZ | xargs -0 rm 。

-Z通常和-l结合使用 6)grep的静默输出:在静默模式(quiet mode)中。grep命令不会向标准输出打印不论什么输出。它仅是运行命令,然后依据命令运行成功与否返回退回状态。使用-q 7) 打印出匹配文本之前或之后的行 要打印匹配某个结果之后的3行,使用-A选项  -A NUM, --after-context=NUM。

比如 $seq 10 | grep   -A 3 5 要打印匹配某个结果之前的3行,使用-B选项 -B NUM, --before-context=NUM。比如 $seq 10 | grep  -B 3 5 要打印匹配某个结果之前以及之后的3行。使用-C选项  -C NUM, -NUM, --context=NUM。比如 $seq 10 | grep-C 3 5 假设有多个匹配。那么以一行“--”作为各匹配之间的定界符。比如 $ echo -e "a b c a b c" | grep a -A 1

3.diff命令

diff命令能够找出两个文件的区别。
diff /root/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0

4.wc命令

wc是一个用于统计的工具。它是Word Count(单词统计)的缩写。
1)统计行数$ wc -l file
2)统计单词数 $ wc -w file
3)统计字符数 $ wc -c file
4)当不适用不论什么选项运行wc时:$ wc file 它仅仅会打印文件的行数、单词数和字符数。彼此之间用制表符切割

5.sed命令

sed命令是流编辑(stream editor)的缩写符,用于搜索并改动文件里指定的单词甚至文本流。

假设要替换全部内容,须要在命令尾部加上參数g 其方法例如以下:$ sed 's/pattern/replace_string/g' file 后缀/g意味着sed会替换每一处匹配。可是有时候我们不须要替换前N处匹配。而是须要替换剩下的匹配。当须要从第N处匹配開始替换时,能够使用/Ng 比如: $echo this thisthisthisthis | sed 's/this/THIS/4g' sed经常使用组合命令 1)移除空白行 2) 已匹配字符串标记&  $ echo this is an example | sed 's/w+/[&]/g' 正則表達式 w+ 匹配每个单词。然后我们用[&]替换它,&相应于之前所匹配到的单词 3) 子串匹配标记1  &代表匹配给定样式的字符串 4)组合多个表达式  5) 引用

sed能够替换给定文本中的字符串。 $ sed 's/pattern/replace_string/' file
-i选项:将替换结构应用于原文件。 比如:$ sed -i 's/text/replace/' file  等价于 $ sed 's/text/replace/' file > newfile    ;   $mv newfile file
 $ sed '/^$/d' file
在sed中。用&标记匹配样式的字符串。就行在替换字符串时使用已匹配的内容
$ echo seven EIGNT | sed 's/([a-z]+) ([A-Z]+)/2 1/'   ([a-z]+)匹配第一个单词 ([A-Z]+)匹配第二个单词 1和、2用来引用它们。

这样的医用被称为向后引用(back  referencing)。

在替换部分。它们的次序被更改为 2  1 因此结果就呈现出逆序的形式。

$ sed 'expression' | sed "expression' 等价于 $ sed  'expression; expression'
sed表达式通经常使用单引號引用。只是也能够使用双引號。

双引號会通过对表达式求值来对其进行扩展。当我们想在sed表达式中使用一些变量字符串时,双引號就实用武之地了。

比如: $  text=hello  $echo hello world | sed "s/$text/HELLO/"  结果HELLO word, $text的求值结果是hello

6.awk命令

一个awk脚本通常由3部分组成: BEGIN语句块、END语句块和能够使用模式匹配的通用语句块。

比如 echo -e "line1 line2" | awk  'BEGIN {print "Start"} {print} END{print "End"}‘ 关于print,须要记住两件重要的事情:当print的參数是以逗号进行切割时,參数打印时则以空格作为定界符。在awk的print语句中。双引號是被当做拼接操作符(concatenation operator)使用的。比如: $ echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3;}' 输出 v1 v2 v3 $ echo | awk '{  var1="v1"; var2="v2"; var3="v3"; print var1 "-" var2 "-" var3;}'  输出 v1-v2-v3 补充内容 1)特殊变量 NF:表示字段数量(number of fields ),在运行过程中相应于当前的字段数。

$0 :这个变量包括运行过程中当前行的文本内容 $1 :这个变量包括第一个字段的文本内容 $2 :这个变量包括第二个字段的文本内容 比如 我们能够用print $NF打印一行中最后一个字段,用$(NF-1)打印倒数第二个字段。其它字段依次类推就可以。 要打印从M行到N行这个范围内的全部文本,语法 $ awk 'NR==M, NR==N' filename 要打印处于start_pattern与end_pattern之间的文本,语法 $ awk '/start_pattern/, /end_pattern/' filename 用于awk中的样式为正則表達式 2)将外部变量值传递给awk 还有还有一种灵活的方法能够将多个外部变量传递给awk 比如: $ var1="Variable1" ;var2="Variable2" $ echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 在上面的方法中。变量之间用空格分隔,以键-值对的形式(v1=$var1 v2=$var2 )作为awk的命令行參数紧随在BEGIN、{ }和END语句块之后。

3)用getline读取行 比如:seq 5| awk 'BEGIN { getline;print $0}{print $0}'

4)用样式对awk处理的行进行过滤 $ awk 'NR < 5' # 行号小于5的行 $ awk 'NR==1,NR==4' #行号在1到5之间的行 $ awk '/linux/' # 包括样式linux的行(能够用正則表達式来指定样式) $ awk '!/linux/' # 不包括样式linux的行 5)设置字段定界符 在BEGIN语句块中则能够用FS=“delimiter” 设置输出字段的定界符 $ awk 'BEGIN {FS=":"} {print $NF }' /etc/passwd 6) 从awk中读取命令输出 awk支持以文本作为索引的关联数组 7) 在awk中使用循环 awk有非常多内建的字符串控制函数: length(String) index(string,search_string) split(string,array,delimiter) substr(string,start-position,end-position) sub( regex, replacement_str, string) 将正則表達式匹配到的第一处内容替换成replacement_str gsub( regex, replacement_str, string) 将正則表達式匹配到的全部内容替换成replacement_str match( regex, string) 检查正則表達式能否够匹配字符串。

假设能够匹配,返回非0值;否则,返回0。match()有两个相关的特殊变量,RSTART包括正則表達式所匹配内容的起始位置,而RLENGTH包括正則表達式所匹配内容的长度。

awk被设计用于数据流。它很有趣,其原因就在于它能够对列和行进行操作。
awk脚本的结构基本例如以下所看到的: awk ' BEGIN { print "start" } pattern { commands } END { print "end" } file
NR:表示记录数量(number of records)。在运行过程中相应于当前行号。
。。

$N :这个变量包括第N个字段的文本内容
比如:$var=10000 $ echo | awk -v VARIABLE=$var '{ print VARIABLE }'
通常。grep默认读取一个文件的全部行。

假设仅仅想读取某一行,能够使用geiline函数。有时候。我们须要从BEGIN语句块中读取第一行。

我们能够为须要处理的行指定一些条件,比如:
默认的字段定界符是空格。我们能够用-F “delimiter”明白指定一个界定符: $ awk -F: '{ print $NF }' /etc/passwd
$echo | awk '{ "grep root /etc/password" | getline cmdout; print cmdout }' 通过使用getline,可以将外部shell命令的输出读入变量cmdout
在awk中能够使用for循环,其格式: for( i=0;i<10;i++) { print $i; } 或者 for( i in array) { print array[i] }

原文地址:https://www.cnblogs.com/mengfanrong/p/5303419.html