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 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\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] }
梦想还是要有的,万一实现了呢?