Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带点(.)的bash命令的最终结果_Bash_Shell_Sorting_Unix_Grep - Fatal编程技术网

带点(.)的bash命令的最终结果

带点(.)的bash命令的最终结果,bash,shell,sorting,unix,grep,Bash,Shell,Sorting,Unix,Grep,我有一个bash脚本,可以在这里对/etc/passwd中的信息进行greps和排序 export FT_LINE1=13 export FT_LINE2=23 cat /etc/passwd | grep -v "#" | awk 'NR%2==1' | cut -f1 -d":" | rev | sort -r | awk -v l1="$FT_LINE1" -v l2="$FT_LINE2" 'NR>=l1 && NR<=l2' | tr '\n' ',' |

我有一个bash脚本,可以在这里对/etc/passwd中的信息进行greps和排序

export FT_LINE1=13
export FT_LINE2=23
cat /etc/passwd | grep -v "#"  | awk 'NR%2==1' | cut -f1 -d":" | rev | sort -r | awk -v l1="$FT_LINE1" -v l2="$FT_LINE2" 'NR>=l1 && NR<=l2' | tr '\n' ',' | sed 's/, */, /g'
如何用点(.)替换最后一个逗号?我希望它看起来像这样

sstq_, sorebrek_brk_, soibten_, sirtsa_, sergtsop_, sec_, scodved_, rlaxcm_, rgmecived_, revreswodniw_, revressta_.
您可以添加:

| sed 's/,$/./'
(其中,
$
表示“行尾”)。

您可以添加:

| sed 's/,$/./'

(其中,
$
表示“行尾”)。

在您的命令中有许多管道,其中一些管道可以删除

正如评论中所解释的那样,猫grep是一种坏习惯!!!通常,
cat | cmd
应替换为
cmd
cmd
,具体取决于命令接受的参数类型

对于要处理的几GB大小的文件,您已经感受到了差异

也就是说,您可以通过使用
awk
来完成整个处理,而无需使用单个管道,例如:

awk  -v l1="$FT_LINE1" -v l2="$FT_LINE2" 'function reverse(s){p=""; for(i=length(s); i>0; i--){p=p substr(s,i,1);}return p;}BEGIN{cmp=0; FS=":"; ORS=","}!/#/{cmp++;if(cmp%2==1) a[cmp]=reverse($1);}END{asort(a);for(i=length(a);i>0;i--){if((length(a)-i+1)>=l1 && (length(a)-i)<=l2){if(i==1){ORS=".";}print a[i];}}}' /etc/passwd

awk-vl1=“$FT_-LINE1”-vl2=“$FT_-LINE2”函数反转{p=“”;for(i=length(s);i>0;i--){p=p substr(s,i,1);}返回p;}开始{cmp=0;FS=“:”;“ORS=”,“}/#/{cmp++;if(cmp%2==1)a[cmp]=reverse($1);}END{asort(a);for(i=length(a);i>0;i--){if(length(a)-i+1)>=l1&(length(a)-i在您的命令中有很多管道,其中一些管道可以删除

正如注释
cat | grep
是一种坏习惯!!!通常,
cat | cmd
应替换为
cmd
cmd
,具体取决于命令接受的参数类型

对于要处理的几GB大小的文件,您已经感受到了差异

也就是说,您可以通过使用
awk
来完成整个处理,而无需使用单个管道,例如:

awk  -v l1="$FT_LINE1" -v l2="$FT_LINE2" 'function reverse(s){p=""; for(i=length(s); i>0; i--){p=p substr(s,i,1);}return p;}BEGIN{cmp=0; FS=":"; ORS=","}!/#/{cmp++;if(cmp%2==1) a[cmp]=reverse($1);}END{asort(a);for(i=length(a);i>0;i--){if((length(a)-i+1)>=l1 && (length(a)-i)<=l2){if(i==1){ORS=".";}print a[i];}}}' /etc/passwd

awk-vl1=“$FT_-LINE1”-vl2=“$FT_-LINE2”函数反转{p=”“;for(i=length(s);i>0;i--{p=p substr(s,i,1);}return p;}BEGIN{cmp=0;FS=“:”;ORS=“,”}!/{cmp++;if(cmp%2==1)a[cmp]=reverse($1)}END{asort(a);for(i=length(a);i=length(a)}为什么
rev
在对行进行排序之前就要对行进行排序?
。| cut-f1-d:“| sort-r
会给出相同的结果。然后,
grep
在文件上工作,因此您不需要
cat
-而是
grep-v”#”/etc/passwd | awk…
-这是从管道中删除的两个进程。您需要恢复所有用户的原因是什么?为什么要在对行进行排序之前恢复这些行?
…| cut-f1-d”:| sort-r
会给您相同的结果。然后,
grep
在文件上工作,因此您不需要
cat
-而是
grep-v“|”/etc/passwd | awk…
-这是从管道中删除的两个进程。您需要恢复所有用户有什么原因吗?我认为这不起作用,我只想替换最后一个命令。我不认为这会起作用,我只想替换最后一个命令。我最终将在下次使用它!但现在,我能做些什么吗加上我在上面写的,用句号替换列表末尾的逗号?@GabeSpound:然后你可以使用ruakh
sed's/,$/./’的解决方案,它应该可以正常工作;-)下一次肯定会用到这个!但是现在,我可以在上面写的内容中添加任何东西,用句号替换列表末尾的逗号吗?@GabeSpound:然后你可以使用ruakh
sed的/,$/”
的解决方案,它应该可以正常工作;-)