“Shell遍历文件的每一行”的版本间的差异
跳到导航
跳到搜索
(未显示同一用户的6个中间版本) | |||
第2行: | 第2行: | ||
=原因= | =原因= | ||
由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,因为当行里有空格的时候,输出的结果会很乱,所以…… | 由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,因为当行里有空格的时候,输出的结果会很乱,所以…… | ||
+ | =while 循环= | ||
+ | <pre> | ||
+ | while read -r line | ||
+ | do | ||
+ | echo $line | ||
+ | done < filename | ||
+ | |||
+ | |||
+ | While循环中read命令从标准输入中读取一行,并将内容保存到变量line中。在这里,-r选项保证读入的内容是原始的内容,意味着反斜杠转义的行为不会发生。输入重定向操作符< file打开并读取文件file,然后将它作为read命令的标准输入 | ||
+ | |||
+ | |||
+ | |||
+ | 今天遇到一个问题弄了好久才搞明白:我想在循环中动态链接字符串,代码如下: | ||
+ | |||
+ | for line in `cat filename` | ||
+ | do | ||
+ | echo ${line}XXYY | ||
+ | done | ||
+ | |||
+ | 就是在每一次循环过程中给取出来的字符串后面添加“XXYY”字符,但是程序就是运行不出来正确的结果。 | ||
+ | 后来发现是因为我的文件是才Window下生产的,在Linux下读取这样的文件由于换行符的不同会导致程序运行不出来正确的结果。 | ||
+ | 解决办法:在Linux安装dos2unix小工具,经过该工具转化以后的文件再进行读取就没有问题了 | ||
+ | |||
+ | </pre> | ||
+ | |||
=得到一个批量删除 redis 脚本= | =得到一个批量删除 redis 脚本= | ||
<pre> | <pre> | ||
第54行: | 第79行: | ||
done | done | ||
+ | </pre> | ||
+ | =把所有目录权限修改为755,所有文件为644= | ||
+ | <pre> | ||
+ | 再举个实际点的例子(把所有目录权限修改为755,所有文件为644): | ||
+ | |||
+ | # find ./ -type f>filelist | ||
+ | # find ./ -type d>dirlist | ||
+ | # cat dirlist |while read i; | ||
+ | do | ||
+ | chmod 755 "${i}"; | ||
+ | done | ||
+ | # cat filelist |while read i; do chmod 644 "${i}"; done | ||
+ | </pre> | ||
+ | |||
+ | =see also= | ||
+ | [https://blog.csdn.net/jk110333/article/details/7690868 如上面不行就参考这个shell实现:读文件一行,sed操作文件某一行] | ||
+ | |||
+ | |||
+ | [https://blog.csdn.net/theonegis/article/details/52751238 Shell脚本循环读取文件中的每一行] | ||
+ | |||
+ | =其它参考= | ||
+ | <pre> | ||
+ | 循环出每一行数据,再分割每个字符 做处理 | ||
+ | |||
+ | cat file_name | while read line | ||
+ | |||
+ | do | ||
+ | echo $line; | ||
+ | array=(${line///t/ }) | ||
+ | appkey=${array[0]} | ||
+ | file_name=${array[1]} | ||
+ | |||
+ | done; | ||
+ | |||
+ | 原文链接:https://blog.csdn.net/yan88888888888888888/article/details/103298561 | ||
</pre> | </pre> |
2020年2月3日 (一) 12:25的最新版本
原因
由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,因为当行里有空格的时候,输出的结果会很乱,所以……
while 循环
while read -r line do echo $line done < filename While循环中read命令从标准输入中读取一行,并将内容保存到变量line中。在这里,-r选项保证读入的内容是原始的内容,意味着反斜杠转义的行为不会发生。输入重定向操作符< file打开并读取文件file,然后将它作为read命令的标准输入 今天遇到一个问题弄了好久才搞明白:我想在循环中动态链接字符串,代码如下: for line in `cat filename` do echo ${line}XXYY done 就是在每一次循环过程中给取出来的字符串后面添加“XXYY”字符,但是程序就是运行不出来正确的结果。 后来发现是因为我的文件是才Window下生产的,在Linux下读取这样的文件由于换行符的不同会导致程序运行不出来正确的结果。 解决办法:在Linux安装dos2unix小工具,经过该工具转化以后的文件再进行读取就没有问题了
得到一个批量删除 redis 脚本
cat r del hello_coin_limit_config_1186883712095948803_1 [root@prod-hello-nginx02 evan]# bash f del hello_coin_limit_config_1186883712095948803_1 如何批量 执行 evan@bsd-latop:~/test % cat r del hello_coin_limit_config_1186883712095948803_1 del hello_coin_liiiiiidsafasjfig_1186883712095948803_1 evan@bsd-latop:~/test % cat ff cat $1 | while read line #cat r | while read line do echo $line done evan@bsd-latop:~/test % bash ff r del hello_coin_limit_config_1186883712095948803_1 del hello_coin_liiiiiidsafasjfig_1186883712095948803_1 cat $1 | while read line #cat r | while read line do echo $line done 最终得到一个批量删除redis key 脚本 #!/bin/bash cat $1 | while read line do redis-cli -c -h 172.31.22.218 -p 7000 -a hello $line redis-cli -c -h 172.31.22.218 -p 7001 -a hello $line redis-cli -c -h 172.31.16.135 -p 7002 -a hello $line redis-cli -c -h 172.31.16.135 -p 7003 -a hello $line redis-cli -c -h 172.31.23.43 -p 7004 -a hello $line redis-cli -c -h 172.31.23.43 -p 7005 -a hello $line done
把所有目录权限修改为755,所有文件为644
再举个实际点的例子(把所有目录权限修改为755,所有文件为644): # find ./ -type f>filelist # find ./ -type d>dirlist # cat dirlist |while read i; do chmod 755 "${i}"; done # cat filelist |while read i; do chmod 644 "${i}"; done
see also
如上面不行就参考这个shell实现:读文件一行,sed操作文件某一行
其它参考
循环出每一行数据,再分割每个字符 做处理 cat file_name | while read line do echo $line; array=(${line///t/ }) appkey=${array[0]} file_name=${array[1]} done; 原文链接:https://blog.csdn.net/yan88888888888888888/article/details/103298561