linux shell 攻略

linux shell 攻略 (笔记)

sed 流编辑器

已匹配字符串标志&

sed 's/[^\n]/&\n/g'
sed '/^$/d' 去除空行
uniq -c 统计每行重复次数
tr -d ' \n' 删除空格和换行符

bash匹配

%string 从右往左匹配,截取左边的字符串
%%string贪婪匹配

 DannyYo@DannyYo-pc  /myshell/test  file_jpg="namememe.jpg"
 DannyYo@DannyYo-pc  /myshell/test  name=${file_jpg%%me*}  
 DannyYo@DannyYo-pc  /myshell/test  echo $name             
na
 DannyYo@DannyYo-pc  /myshell/test  name=${file_jpg%me*}  
 DannyYo@DannyYo-pc  /myshell/test  echo $name          
nameme

同理
string# 从左往右匹配,截取右边
string## 贪婪

临时文件名命名

temp_file=$(tempfile) 
temp_file="/tmp/file-$RANDOM"  #返回随机数
temp_file="/tmp/var.$$"  #.$$返回当前脚本进程ID 

批量重命名

count=1
for img in *.jpg
do 
new=image-$count.${img##*.}
mv "$img" "$new" 2> /dev/null

if [ $? -eq 0 ]; then
echo "Renaming $img to $new"
let count++
fi
done

rename 's/ /_/g' * 把文件名中的空格替换成’_’
rename 'y/a-z/A-Z/' * 把文件名转换成大写

-rw-rw-r-- 1 DannyYo DannyYo  330 Apr  2 10:20 LS_RESULT
find ./ -type f -exec rename 's/_/$$/g' {} \;   # 把本目录下的文件名含有'_'换成$$
-rw-rw-r-- 1 DannyYo DannyYo  330 Apr  2 10:20 LS7584RESULT

拼写检查与词典操作

#! /usr/share/dict/american-english
word=$1
#grep "^$1$" /usr/share/dict/american-english -q
output=`echo \"$word\" | aspell list`  # aspell list 输出查询结果 
#if [ $? -eq 0 ]; then
if [ -z $output ]; then  # -z 用于确认output是否为空
echo $word is a dictionary word;
else
echo $word is not a dictionary word;
fi
fi

head与tail

head -n 4 file.txt #前四行
head -n -4 file.txt #除了前四行
seq 11 | head -n -5 #seq 产生连续数
seq 20 | tail -n 5  #尾五行
seq 20 | tail -n +6  #除了第五行  +(N+1)   即从第六行开始

gedit file.txt
pid=$(pidof gedit) 
echo $pid         
25683
tail -f file.txt --pid $pid # -f跟踪文件修改信息知道进程关闭

只列出目录的其他方法

dir 并不只能列出目录 (类似ls的阉割版)
而dirs 只能列出 目录堆的内容(下面会说到)

ls -d */  # -d  仅显示目录名和显示符号链接文件本身(指向目录) 写法唯一  
ls -F | grep "/$"  # -F 输出项带有文件类型字符 @链接 *可运行文件  | (?不明)   / 目录 
ls -l | grep "^d"   #输出文件字符类型前缀 d为目录
find . -type d -maxdepth 1 -print  # find 目录类型 且 最大深度为1 没有向子目录搜索   

文件字符类型

  1. - 普通文件 - d 目录 c 字符设备文件(猫等串口设备)
    b 块设备文件(硬盘光驱等设备) s 套接口文件(ex. mysql.sock) l 符号链接文件

pushd popd 快速定位

 DannyYo@DannyYo-pc  /etc  dirs  
 # +N:将第N个目录删除,从左边数起,数字从0开始  -N:从右边  (如果与当前路径相同跳过且从那开始计数)
/etc  /opt  /etc/default  /usr/src    
        2          1                0
 DannyYo@DannyYo-pc  /etc  pushd +2
/opt /etc/default  /usr/src  /etc
         2                 1        0
 DannyYo@DannyYo-pc  /opt  pushd +1
/usr/src /etc /opt /etc/default
 DannyYo@DannyYo-pc  /usr/src  
...
/etc/menu-methods /usr/src /etc /etc/default
 DannyYo@DannyYo-pc  /etc/menu-methods  popd   #删除当前,并切下一个目录
/usr/src /etc /etc/default
 DannyYo@DannyYo-pc  /usr/src 

统计文件

wc file.txt  # -l :9行  -w : 11单词  -c : 61字符
 9 11 61 file.txt
wc file.txt -L   #-L 打印最长行的长度
21 file.txt
---------
 DannyYo@DannyYo-pc  /myshell/test  echo -n "aaa a" | wc -c  # -n 避免echo添加额外换行符
5
 DannyYo@DannyYo-pc  /myshell/test  echo "aaa a" | wc -c 
6
 DannyYo@DannyYo-pc  /myshell/test  echo -n aaa
aaa%                                                                                                 
DannyYo@DannyYo-pc  /myshell/test  echo aaa   
aaa

打印目录树

 DannyYo@DannyYo-pc  /myshell/test   tree ./ -P "*.[sS][hH]"   # 匹配 -P
./
├── checkword.sh
├── COUNT.SH
├── ddd
├── MATCHZN.SH
└── RENAME.SH

 DannyYo@DannyYo-pc  /myshell/test   tree ./ -I "*.[sS][hH]"  #反选 -I
./
├── ddd
│   └── myshell -> /myshell
├── ddddf -> /myshell
├── file.txt

 DannyYo@DannyYo-pc  /myshell/test  tree -h ./  #显示大小 ,不能和匹配同时使用
.
├── [ 258]  checkword.sh
├── [ 120]  COUNT.SH
├── [4.0K]  ddd
│   └── [   8]  myshell -> /myshell

tree PATH -H http://localhost -o out.html # 生成html输出

###echo 命令
使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;

grep搜索

 DannyYo@DannyYo-pc  /myshell/test  grep "^sdf$" . -r --include *.{txt,sh}  #在所有的txt和sh文件中递归查找
./file.txt:sdf
--exclude 排除某个文件 --exclude-dir 目录 --exclude-from 文件列表(文件)

grep接合xargs应使用0值字节(\0)后缀(防止空格被认为终结符)
grep "test" file* -lZ | xargs -0 rm #-l 列出结果 -Z以\0为终结符
grep -q #静默模式 返回0匹配成功

打印匹配结果之前或之后的结果

seq 10 | grep 5 -A 3  # -A 之后三行 即5678
-B N #之前 N行 
-C N # 之前及之后N行

 DannyYo@DannyYo-pc  /myshell/test  echo -e "a\nb\nc\na\nb\nc" | grep a -A 1 #若多个匹配则以 -- 间隔
a
b
--
a
b

用cut切分文件

cut -f2,4 -d";" --complement data.txt #以;为定界符取第2,4以外的其他字段
cut data.txt -c1-3,6-9 --output-delimiter "," # 取第1到第3个 和第6到第9个字符 ,并且以,隔开

统计词频

 DannyYo@DannyYo-pc  /myshell/test  egrep -o "\b[[:alpha:]]+\b" file.txt | 
 awk '{ count[$0]++}   
END{ 
printf("%-14s%s\n","Word","Count"); 
for(ind in count) 
{ 
printf("%-14s%d\n",ind,count[ind]); 
}
}' #关联数组 $0 第一字段
#[[:alpha:]]大部分场合与[a-zA-Z0-9]等价
Word          Count
fsdfsfsfsf    1
dfsdf         1
sd            1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值