도움이 필요합니다.
a) TCP 및 UDP에 대한 매개변수 개수가 포함된 파일을 생성하는 명령을 작성합니다. 다른 프로토콜(예: IP 또는 XFRM)의 매개변수는 계산에 포함되어서는 안 됩니다.
이러한 매개변수는 /proc/sys/net/ipv4/의 개별 파일에 설정되며, 여기서 프로토콜(TCP 또는 UDP)은 파일 이름의 처음 몇 글자로 결정됩니다. 한 줄).
개별 명령은 파이프와 리디렉션을 사용할 수 있지만 명령을 단순히 결합할 수는 없습니다(예: ; 사용). 처음 몇 줄의 예는 다음과 같습니다:
63 tcp
3 udp
이것이 내가 지금까지 가지고 있는 것입니다:
ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3
답변1
이 경우 파일 수를 계산하기 위해 파이프나 리디렉션을 사용하는 대신 셸에서 이를 수행하도록 했습니다.
$ set -- /proc/sys/net/ipv4/tcp*
$ printf '%d tcp\n' "$#"
73 tcp
$ set -- /proc/sys/net/ipv4/udp*
$ printf '%d udp\n' "$#"
5 udp
또는 출력 파일에 씁니다.
{ set -- /proc/sys/net/ipv4/tcp*; printf '%d tcp\n' "$#"
set -- /proc/sys/net/ipv4/udp*; printf '%d udp\n' "$#"; } >outputfile
이를 인위적으로 단일 복합 명령으로 변환할 수 있지만 누구도 다음과 같은 코드를 작성하지 않습니다.
$ set -- /proc/sys/net/ipv4/tcp* && printf '%d tcp\n' "$#" && set -- /proc/sys/net/ipv4/udp* && printf '%d udp\n' "$#"
73 tcp
5 udp
두 명령 세트 모두에서 파일 이름 와일드카드 패턴을 확장하고 위치 인수를 확장된 경로 이름 목록으로 설정한 다음 단순히 목록의 요소 수를 출력하여 파일 수를 계산합니다.
두 패턴 중 아무 것도 일치하지 않으면(0 대신 1) 잘못된 개수를 얻게 됩니다. 설정 nullglob
의 셸 옵션을 통해 이 문제를 해결할 수 있습니다 bash
.
이는 파일 이름에 줄 바꿈 및 기타 이상한 문자가 포함된 이론적인 코너 케이스에도 적용됩니다.
위와 동일한 작업을 수행하는 명령(예: awk
및 로 시작하는 파일 이름의 발생 횟수 계산):tcp
udp
awk '
BEGIN {
for (i=1;i<ARGC;++i) { sub(".*/","",ARGV[i]); sub("_.*","",ARGV[i]); c[ARGV[i]]++ }
for (i in c) print i, c[i]
}' /proc/sys/net/ipv4/{tcp,udp}*
답변2
-l
권한, 소유권, 크기 등 파일 세부정보에는 관심이 없으므로 이 옵션이 필요하지 않습니다 . 파일 이름만 필요합니다.
이 grep
명령은 효과가 없습니다. grep
질문에서는 tcp 및 udp 파일을 별도로 계산하도록 요구하므로 어쨌든 도움이 되지 않습니다.
파일 수를 계산하려면 다음을 사용할 수 있습니다 ls|wc -l
. 이름이 "tcp"로 시작하는 파일 수를 계산하려면: ls tcp*|wc -l
. "udp"에 대해 동일한 작업을 수행하고 두 숫자를 하나의 에코로 결합합니다.
echo -e "$(ls /proc/sys/net/ipv4/tcp*|wc -l) tcp\n$(ls /proc/sys/net/ipv4/udp*|wc -l) udp" > out
개행 문자를 처리 해야 합니다 -e
.
파일 이름에 개행 문자가 포함되어 있으면 작동하지 않지만 /proc/sys/net/ipv4에서는 그렇지 않다고 안전하게 가정할 수 있습니다.
질문을 다시 읽어보니 제 답변이 맞는지 잘 모르겠습니다. 매개변수가 아닌 파일만 계산합니다. 이제 가정을 해야 합니다. 매개변수는 해당 파일에 있는 단어입니다. 대부분의 파일에는 한 단어만 포함되어 있지만 일부 파일에는 더 많은 단어가 포함되어 있습니다. 단어 수를 계산하려면 wc -w
대신 를 사용 ls
하여 cat
파일 내용에 액세스하세요.
echo -e "$(cat /proc/sys/net/ipv4/tcp*|wc -w) tcp\n$(cat /proc/sys/net/ipv4/udp*|wc -w) udp" > out
답변3
예제에서 누락된 것은 uniq -c
다음과 같이 파이핑하는 것입니다.
ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 | uniq -c
내 시스템에서 실행할 때 얻는 결과는 다음과 같습니다.
$ ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 | uniq -c
68 tcp
5 udp
답변4
제가 생각해낸 해결책은 다음과 같습니다.
ls /proc/sys/net/ipv4 | grep "tcp\|udp" | cut -d "_" -f1 |sort |uniq -c > output.txt
모두의 도움에 감사드립니다 :)