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 没有向子目录搜索
文件字符类型
- - 普通文件 - 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