-
/dev/stderr 代表标准错误
/dev/stdin 输出可以用 -
/dev/stdout 代表标准输出 -
输出符号意义
> 表示先清空文件,然后再写内容
>> 表示内容追加到现有文件的尾部 -
/dev/null 是一个特殊的设备文件,它接收的任何数据都会丢弃
-
将脚本内部的文本块进行重定向
#! /bin/base cat <<EOF>> log.txt LOG FILE HEADER this is a test log file Function: System statics EOF
-
- < 从文件读取stdin
- > 操作符,用于截断模式的文件写入
- >> 操作追加模式的文件写入
-
find 命令
1. 查找普通模式 find . -name(-iname 忽略大小写) 'aa.txt' find . -name 'a*' 点代表当前目录,两个点代表父母目录,/ 代表根目录 2. 更好的方法 查找目录 find . -type d -print 查找文件 find . -type f -print 如果想看更多,如权限等。加 |xargs ls -l 说明:https://www.cnblogs.com/kilometerwine/p/9872265.html 3. 支持 与/或逻辑 find . \(-name '*.txt' -o -name '*.pdf'\) -print -a 就 4. find /home/users -path '*/slynux/*' -name '*.txt' -print 5. 基于正则表达式 find . -regex '.*\.(py\|sh\)$' -iregex 忽略大小写 find . -iregex '.*\(\.py\|\.sh\)$' 6. 否定参数 find . ! -name "*.txt" -print 7. 基于目录深度的搜索 find -L /proc -maxdepth 1 -name 'bundlemaker.def' 2 > /dev/null 8. 文件类型 普通文件<=> f | 符号链接 <=> l | 目录 -> d | 字符设备 -> c 块设备 -> b | 套接字 -> s | FIFO -> p 9. 根据 文件的时间戳进行搜索 访问时间 -atime 修改时间 -mtime 变化时间 -ctime 7天内访问 find . -type f -atime -7 -print 7天前访问 find . -type f -atime +7 -print 10. 记录文件大小 find . -type f -size +2k 11. 利用find执行相应操作 find . -type f -name "*.swp" -delete
-
grep
1. 匹配多个文件 grep "match.text" file1 file2 file 3 2. 着重标记 grep --color=auto world filename 3. 使用正则 egrep "[a-z]+" filename 4. 只输出匹配到的文本 egrep -o "[a-z]+\." 5. 打印不匹配结果 grep -v match_patttern filename 6. 统计匹配的文本行数 grep -c "text" filename 7. 统计匹配数量 egrep -o "{0-9}" | wc -l 8. 打印匹配所在行 grep linux -n sample1.txt 9. 匹配模式所在的文件 grep -l 'linux' simaple.txt simple2.txt (如果相反是大写) 10. 递归搜索多个文件 grep "txt" . -R -n 同等与 find . -type f | xarge grep "test _function()" . -R -n 或 find . -type f | xargs grep "test_function()" 11. 忽略大小写 echo hello world | grep -i "HELLO" 12. 匹配多个模式 grep -e "pattern1" -e "pattern2" 匹配到一个,就是一行 echo this is a line of text | grep -o -e "this" -e "line" 将多个模式放到文件中 grep -f pattern_filesource_filename 13. grep 可以在搜索中使用通配符或排除某些文件 使用--include选项在目录中递归搜索所有的.c 和 .cpp 文件: grep "main()" . -r --include *.{c,cpp} 使用--exclud在搜索过程中排除所有的README文件 grep "main()" . -r --exclude "README" 选项--exclude-dir 可以排除目录 grep main . -r -exclude-dir cvs 14. 使用0值字节后缀的xargs 与 grep grep "test" file* -lZ | xargs -0 rm 15. grep 静默输出, 只获取是否匹配成功 一个ssh #!/bin/base # 文件名:silent_grep.sh #用途:测试文件是否包含特定的文本内容 if [$# -ne 2]; then echo "Usage:$0 match_text filename*" exit 1 fi match_text=$1 filename=$2 grep -q "$match_text" $filename if [$? -eq 0]; then echo "the text exists in the file" else echo "text does not exists in the file" fi 执行命令 ./silent_grep.sh Student student_data.txt 16. 打印出匹配文本之前或之后的行 选项-A可以打印匹配结果之后的行 seq 10 | grep 5 -A 3
-
正则表达式
1. 匹配任意单词的正则表达式 ( +[a-zA-Z]+ +) 2. 匹配句尾或是都前的单词 ( +[a-zA-Z]+[?,.]? +) [?,.]? 表示仅需要匹配问号、逗号或点号中的一个 3. [[:digit:]] 表示数字
-
使用cut按列切分文件
cut命令可以按列,而不是按行来切分文件。该命令可用于处理使用使用固定宽度字段的文件。CSV文件或是由空格分隔的文件 1. 选项 -f 可以指定要提取的字段 cut -f FIELD_LIST filename $cut -f2,3 filename 2. --complement 选项显示出没有被-f 指定的那些字段 cut -f3 --complement student_data.txt 3. 选项-d 能够设置分隔符 cut -f2 -d";" delimited_data.txt 4. 指定字段的字符或字节范围 N- 从第N个字节、字符或字段开始到行尾 N-M 从第N个字节、字符或字段开始到第M个 -M 从第1个字节,到第M个 5. 指定字段的字符或字节范围 -b 表示字节 -c 表示字符 -f 用于定义字段 6. --output -delimiter 可以指定输出分隔符 cut range_fields.txt -c-2,6-9 --output-delimiter ","
-
使用sed替换文本
1. 替换 sed 's/pattern/replace_string/' file cat etc/passwd/ | cut -d : -f1,3 | sed 's/:/ - UID: /' 2. 选项-i 会使得sed用修改后的数据替换原文件 $sed -i 's/text/replace' file 3. g标记可以使sed执行全局替换 /#g 标记可以使sed替换第N次出现的匹配: - $ echo thisthisthisthis | sed 's/this/THIS/2g' thisTHISTHISTHIS - $ echo thisthisthisthis | sed 's/this/THIS/3g' thisthisTHISTHIS 4. sed命令会将s之后的字符视为命令分隔符 sed 's:text:replace:g' 转义 : sed 's|te\|xt|replace|g' 5. 正则表达式 -- 移除空行 ^$ 匹配空行, /d 执行删除 sed '/^$d' file 6. 直接在文件中替换 sed 's/PATTERN/replacement' -i filename sed -i 's/\b[0-9]\{3\}\b/NUMBER/g' sed_data.txt 其中\b 表示单词边界 - 还可以先不替换源文件,新建一个 sed -i.bak 's/abc/def/' file 7. 已匹配字符串 标记(&) $echo this is an example | sed 's/\w\+/[&]/g' [this] [is] [an] [example] \w\+ 匹配每一个单词 8. 字符串匹配标记 $echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1' this is 7 in a number \(pattern\) 用于匹配子串 \1 匹配到的第一个字段 - secho seven EIGHT | 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' 9. 组合多个表达式 sed 'expression' | sed 'expression' 等同于,sed 'expression;expression' 或者: sed -e 'expression' -e 'expression' 示例: echo abc | sed 's/a/A/' sed 's/c/C/' 10. sed 表达式通常用单引号来引用,shell会在调用sed前先扩展双引号内容 $text = hello $echo hello world | sed "s/$test/HELLO" HELLO world 11. sed /s/pattern/replace/p, /p 会把匹配到的行再输出一遍,也就时匹配到的行会重复输出 12. sed -n /s/pattern/replace/p -n 与 /p 就只输出匹配到的行 13. tac logs/smartfox.log | sed -n '/com.elex.cok.common.core.ThreadTask/ {/50*/ s/503/&\n\n\n/;p}' | less -- 相当于 tac file | sed -n '/A/ {B/ s/C/repace/;p}' (;p - 默认输出) 14. 参考网址https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html
-
使用awk进行高级文本处理
awk 脚本的结构如下: - awk 'BEGIN{ print "start"} pattern {commands} END {print "end"}' file - awk 'BEGIN {statements} {statements} END {end statements}' - awk "BEGIN {i =0} {i++} END {print i}" filename 1. 中间{} 默认执行{print} 2. print 能够接受参数,这些参数以逗号分隔 echo | awk '{var1="v1";var2="v2";var3="v3";print var1,var2,var3;}' 3. 特殊变量 - NR: 表示记录编号,当awk将行作为记录时,该变量相当于当前行号 - NF: 表示字段数量,在处理当前记录时,相当于字段数量,默认的字段分隔符是空格 - $0: 该变量包含当前记录的文本内容 - $1: 该变量包含第一个字段的文本内容 - $2: 该变量包含第二个字段的文本内容 3.awk使用正则 seq 10 | awk 'BEGIN{print "start"} /6.*/ {print} END{print "end"}' 4. 例子 echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | \ awk '{ print "Line no:"NR",No of fields:"NF, "$0="$0, "$1="$1,"$2="$2,"$3="$3 }' 5. 打印每一行的第二和第三个字段 awK '{print $3,$2}' file 6. 我们可以使用NR统计文件行数 awk 'END {print NR}' file 7. 借助选项-v, 我们可以将外部值传递给awk: $VAR=10000 $ echo | awk -v VARIABLE = $VAR '{print VARIABLE}' 8. 还有一种灵活的方法可以将多个外部变量传递给awk $ var1 = "Variable1"; var2 = "Variable2" $ echo | awk '{print v1, v2}' v1=$var1 v2 = $var2 当输入来自于文件而非标准输入时,使用下列命令 $ awk '{print v1,v2}' v1=$var1 v2=$var2 filename 9. 用getline读取行 seq 5 | awk 'BEGIN {getline;print "Read ahead first line", $0}' {print $0} 10. 使用过滤模式对awk处理的行进行过滤 $ awk 'NR < 5' # 行号小于5的行 $ awk 'NR==1, NR==4' # 行号在1到5之间的行 $ awk '/linux/' #包含模式为linux的行(可以用正则表达式来指定模式) $ awk '!/linux/' # 不包含模式为linux的行 11. 设置字段分隔符 awk -F: '{print $NF}' /etc/passwd 或者 awk 'BEGIN {FS=":"} {print $NF}' /etc/passwd 12. 从awk 中读取命令输出 “command” | getline output; $awk 'BEGIN {FS=":"} {"grep root /etc/passwd" | getline; print $1,$6}' 13. 在awk中使用循环 awk 'BEGIN {FS=":"} {nam[$1]=$5}} END{for {i in name} {print i,nam[i]}}' /etc/passwd 14. 使用if netstat -tanp | awk '{if ($2 > 0 || $3 > 0) print $0}' 15. awk内建的字符串处理函数 - length(string) : 返回字符串string的长度 - index(string,serach_string) : 返回search_string 在字符串string出现的位置 - split(string, array, delimiter):以delimiter作为分隔符,分割字符串string,将生成的字符串存入数组array - substr(string, start-position, end-position) : 返回字符串string中以start-position 和 end-position 作为起止位置的字符串 - sub(regex, replancement_str, string): 将正则表达式regex匹配到的第一处内容替换成replacement_str - gsub(regex, replacement_str, string) : 和sub()类似。不过该函数会替换正则表达式 regex匹配到的所有内容 - match(regex, string) : 检查正则表达式regex是否能够在字符串string中找到匹配。如果能够找到,返回非0值;否则,返回0. match() 有两个相关的特殊变量,分别是RSTART 和 RLENGTH。变量RSTATRTv包含了匹配内容的起止位置,而变量RLENGTH包含了匹配内容的长度 16. 更多例子 https://blog.csdn.net/weixin_39953236/article/details/112127491
-
用tr进行转换
tr 是translate(转换)的简写 1. tr [options] set1 set2 2. 要将输入中的字符由大写转换为小写,可以使用下面的命令 echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z' hello who is this 3. tr 进行加密和解密 echo 12345 | tr '0-9' '9876543210' 87654 # 已加密 echo 87654 | tr '9876543210' '0-9' 12345 # 已解密 4. 用tr删除字符 cat file.txt | tr -d '[set1]' 例如: echo "Hello 123 world 456" | tr -d '0-9' hello world 5. 字符组补集 tr -c \[set1\] [set2] - 从输入文本中删除不在补集中的所有字符 echo hello 1 char 2 next 4 | tr -d -c '0-9 \n' 124 - 不在set1中的字符替换成空格 echo hello 1 char 2 next 4 | tr -c '0-9' '' 1 2 4 - 删除多余的空格 tr -s ' ' - 删除多余的换行符 tr -s '\n' - cat sum.txt | echo $[ $(tr '\n' '+' ) 0 ] - 包含字母和数字的文件, 计算数字之和 cat test.txt | tr -d [a-z] | echo "total: $[$(tr ' ' '+'')]" - 字符类 alnum : 字母和数字 alpha : 字母 cntrl : 控制(非打印)字符 digit : 数字 graph : 图形字符 lower : 小写字母 print : 可打印字符 punct : 标点符号 space : 空白字符 upper : 大写字母 xdigit : 十六进制字符 可以按照下面的方式选择所需的字符类 tr [:class:] [:class:] 例如 : tr '[:lower:]' '[:upper:]'
-
统计特定文件中词频
if [$# -ne 1]; then echo "Usage: $0 filename"; exit -1 fi filename=$1 egrep -o "\b[[:alpha:]]+\b" $filename | \ awk '{ count[$0]++ } END{ printf{"%-14s%s\n","World","count"}}' ; for(ind in count) { printf("%-14s%d\n",ind,count[ind]); } - 可以利用tr命令将大写单词和非大写单词合计为一个单词,然后用sort命令排序输出: egrep -o "\b[[:alpha:]]+\b" $filename | tr [A-Z] [a-z] | \ awk '{ count[$0]++ }' END{ printf{"%-14s%s\n","World","count"} ; for(ind in count) { printf("%-14s%d\n",ind,count[ind]); } }' | sort
-
例子
1. cat sample.js | \ tr -d '\n\t' | tr -s ' ' \ | sed 's:/\*.*\*/::g' \ | sed 's/ \?\([{}();,:]\) \?/\1/g' 2. 打印从M行到N行之间的文本: $ awk 'NR==M, NR==N' filename 例如: seq 100 | awk 'NR==4,NR==6' 3. 打印位于模式start_pattern 与 end_pattern之间的文本 $ awk '/start_pattern/, /end_pattern/' filename awk '/pa.*3/, /end/' section.txt 4. tac 命令, 倒序 - seq 5 | tac - tac命令默认使用\n作为行分隔符。使用-s 指定其他分隔符 echo "1,2" | tac-s, - 使用awk的实现方式 seq 9 | \ awk '{ lifo[NR]=$0 } \ END {for(lno=NR;lno>-1;lno--){print lifo[lno]; } }' 5. find . -name *.cpp -print0 | \ xargs -I{} -0 sed -i 's/Copyright/Copyleft/g' {}
-
if 相关
- https://blog.csdn.net/hack8/article/details/53164296
Linux命令
于 2020-01-07 00:53:52 首次发布