Shell 命令--文件创建、搜索命令--总结自《Linux Shell 脚本攻略》
(一)文件创建命令
1.touch命令
例如:touch abc命令在本地目录中创建了一个名为abc的空文件
2.cp命令
cp命令允许我们把一个文件的内容复制到同名或不同名的文件中,复制得到的文件可以在任何目录。使用cp命令的一个风险是它会在不提示用户的情况下很容易覆盖掉不同目录中的文件 -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键向前或向后翻页查看铜件的文本 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 "\b[[:alpha:]]+\b" -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值字节作为终结符的文件(\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\nb\nc\na\nb\nc" | 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 file2)统计单词数 $ 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\nline2" | 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] }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。