“Shell遍历文件的每一行”的版本间的差异

来自linux中国网wiki
跳到导航 跳到搜索
(创建页面,内容为“=原因= 由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,因为当行里有空格的时候,输出的结果会很…”)
 
 
(未显示同一用户的7个中间版本)
第1行: 第1行:
 +
[[category:shell]]
 
=原因=
 
=原因=
 
由于使用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>
第53行: 第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操作文件某一行


Shell脚本循环读取文件中的每一行

其它参考

循环出每一行数据,再分割每个字符 做处理 

    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